旋轉函式(移位加密)- C語言
阿新 • • 發佈:2018-12-22
旋轉函式(移位加密)
題目:
給定一個長度為 n 的整數陣列A。假設Bk是陣列A順時針旋轉k個位置後的陣列,我們定義A的“旋轉函式”F為:
F(k) = 0 * Bk[0] + 1 * Bk[1] + … + (n-1) * Bk[n-1]。
計算F(0), F(1), …, F(n-1)中的最大值。
示例:
A = [4, 3, 2, 6]
F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26
所以F(0),F(1),F(2),F(3)中的最大值是F(3) =26。
程式碼分享:
#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int a[100]; int i,j,k,x,N,s; int C[100]={0}; int max=C[0]; int R[100]={0};//定義多個數組作為中間變數 int z[100]={0}; int v[100]={0}; int m[100] = {0}; printf("請輸入陣列元素個數:\n"); scanf("%d",&N); printf("請輸入陣列元素:\n"); for(i=0;i<N;i++)//迴圈錄入 { scanf("%d",&a[i]); } printf("使用者錄入陣列元素個數為:%d\n",N); printf("使用者錄入元素如下:\n"); for(i=0;i<N;i++)//迴圈列印 { if(i<N) printf("%d,",a[i]); else { printf("%d",a[i]); } } printf("\n*********************************\n"); for(x=0,i=0;x<N;x++,i++) { m[x]=a[i]; } for(x=0;x<N;x++)//列印新陣列值 替代a[i] { printf("%d\t",m[x]); } printf("\n*********************************\n"); for(i=0;i < N;i++) { for(j = 0; j < N; j++) { z[j] = m[(i + j) % N]; //printf("%d",z[j]); } for(j=0;j<N;j++)//計算 { v[j] = (j * z[j]); //v[j]=v[j]+z[j]; R[i] += v[j]; } /*for(s=0;s<N;s++) { printf("\n%d",v[s]); }*/ printf("\n*%d",R[i]); if(max<R[i]) { max=R[i]; } printf("\n%d",max); } printf("\n*********************************\n"); for(j=0;j<N;j++) { printf("F(%d)=",j) ; //j*a[N]+j*a[N-1] for(k=0;k<N;k++) { if(k == 0) { printf("(%d * %d)",k,a[(k+j)%(N)]); } if(k>0 && k<N) { printf("+(%d * %d)",k,a[(k+j)%(N)]); } } printf("=%d.",R[j]); printf("\n"); } printf("\n*********************************\n"); printf("\n最大值為:%d",max); return 0; }
執行結果:
備註:解決本題目時,作者將題目示例的解題過程,列印了出來,在第二張圖片****之間顯示,但該部分對解決移位加密並無實際用途,只是解題思路的直觀體現。
總結:
希望對該題目的程式碼分享能夠幫助到需要的人,也望大佬給出改進意見。