int? main(){
??? int k,i,tail[LEN],m,flag;
??? while(scanf("%d",&k)!=EOF)
?{
??? if(k==0) break;
??? flag=0;???
??? i=m=1;
??? memset(tail,0,sizeof(tail));
?
??? if(k>=LEN)
?{
??????? k=k%LEN;
??????? flag=1;
??? }
?while(1){
??????? i*=k;
??????? if(i>=LEN || flag==1)
??{
??????????? if(tail[i%LEN]==0) tail[i%LEN]=m;
??????????? else {tail[i%LEN]+=m;break;}??
??????????? flag=1;
??????? }
??????? if(i>=LEN) i=i%LEN;
??????? m++;
??? }
??? printf("%d\n",tail[i%LEN]);
??? }
}
B 3n+1 數鏈問題
直接模擬 RMQ一直沒有實現
代碼
#include <iostream>
#include <stdlib.h>
using namespace std;
int done(int i, int j)
{
????? int max=0,count,n;
????? for(int m=i; m<=j; m++){
????????? count=1;
????????? n=m;
????????? while(n!=1){
????????????? if(n%2==0)
????? n=n/2;
????????????? else
????? n=n*3+1;;
????????????? count++;
????????? }
????????? if(count>max) max=count;
????? }
????? return max;
}
int main()
{
????? int i,j,sum;
????? while(cin>>i>>j){
?????? if(i==0&&j==0) break;
????????? if(i>j) sum=done(j,i);
????????? else sum=done(i,j);
????? cout<<sum<<endl;
?}
??? return 0;
}
C計算a^b mod c
代碼
int modular(int a,int b,int m)
{
??? int t=a,tt=1;
??? while(b)
??? {
??????? if(b%2)tt=(tt*t)%m;
??????? t=(t*t)%m;
??????? b/=2;
??? }
??? return tt;
}
D 負權數
算法思想:
當n>0且r>0時
n=an*r^n+an-1*r^(n-1)+…+a0*r^0;
現在討論r<0的情況
?
如果n>0
n=an*|r|^n+an-1*|r|^(n-1)+…+a0*|r|^0;
設其中某項為ap*|r|^p且p!=0
當p為偶數的時候ap*r^p不變
當p為奇數的時候則變為相反數
構造
ap*|r|^p=r^(p+1)+(|r|- ap)*r^p;
?
如果n<0
當p為奇數的時候不變
當p為偶數的變為相反數
?
算法步驟:
對n和r取絕對值
將|n|表示為|r|進制然后根據n的正負針對構造進行相應的操作
既將本位換為|r|-ap并且對高位加一
?
代碼相關問題:
子函數tentor:將十進制n轉換為r進制
子函數increase: 實現高位進位的操作可能改變數字的位數
子函數output:高于十進制的表示方法
注意對0的處理
代碼
#include <stdio.h>
#include <string.h>
#include <math.h>
int n,r,nn,rr,num[101],p,len;
void tentor()
{
?int a,b;
?a=nn,b=rr,len=0;
?memset(num,0,sizeof(num));
?while(a)
?{
??num[len++]=a%b;
??a/=b;
??? }
}
void increase(int p)
{
? while(++num[p]>=rr)
? {?
?????? num[p]=rr-num[p];
?????? p++;
???? }
??? if(p>=len) len++;
}
void output()
{
?int i;
?for(i=len-1;i>=0;i--)
?{
??if(num[i]<10) printf("%d",num[i]);
??else? printf("%c",55+num[i]);
??? }
??? printf("\n");
}
int main()
{
?while(scanf("%d%d",&n,&r)!=EOF)
?{
??if(n==0&&r==0)? break;
??if(n==0) printf("0\n");
??else
??{
??nn=fabs(n);
??rr=fabs(r);
??tentor();
??p=n>0?1:0;
??for(;p<len;p+=2)
??{
???? if(num[p]!=0)
???? {
??? num[p]=rr-num[p];
??? increase(p+1);
???? }
??}
??output();
??? }
??? }
}
G:數值轉換
我是直接觀察的出的結論
代碼
#include<stdio.h>
#include<string.h>
char num[1002];
int len;
int main()
{
?int n,t;
?scanf("%d",&t);
?while(t--)
?{
? scanf("%d",&n);
? len=0;
? if(n==0)
? printf("0\n");
? else
? {
? while(n!=0){
?? if(n>0)
??? switch(n%3){
???? case 0: num[len++]='0'; n/=3; break;
???? case 1: num[len++]='1'; n=(n-1)/3; break;
???? case 2: num[len++]='-'; n=(n+1)/3; break;
??? }
?? else
??? switch(-n%3){
???? case 0: num[len++]='0'; n/=3; break;
???? case 1: num[len++]='-'; n=(n+1)/3; break;
???? case 2: num[len++]='1'; n=(n-1)/3; break;
?? }
? }
? while(--len>=0) putchar(num[len]);
? puts("\0");
? }
?}
}
還有質多項式 猴子舞 大眾匹薩沒有作出來 做出來再貼