nyoj541 最强DE战斗力(数论&&大数问题)
发布时间:2020-12-14 02:36:30 所属栏目:大数据 来源:网络整理
导读:其实这道题 自己写几个数找找规律就找到了 ?会发现把一个数尽可能的拆分为多个3,如果余1,把最后一个3加1,如果余2再乘以2. 这是一位大神的分析。点击打开链接 又因为这道题牵扯到大数 ?所以用字符串保存结果。 #include stdio.h#include string.h#define n
其实这道题 自己写几个数找找规律就找到了 ?会发现把一个数尽可能的拆分为多个3,如果余1,把最后一个3加1,如果余2再乘以2. 这是一位大神的分析。点击打开链接 又因为这道题牵扯到大数 ?所以用字符串保存结果。 #include <stdio.h> #include <string.h> #define num 300 char str[num];//保存结果 int main() { int test,j,t,i,k,n,m,r; scanf("%d",&test); while(test--) { memset(str,sizeof(str)); str[0]=1; scanf("%d",&n); if(n<=4) printf("%dn",n); else { m=n/3,r=n%3;//m判断有多少个3,r保存余数 for(i=1;i<=m-1;i++)//先求3的m-1次方 { for(j=0,t=0;j<num;j++)//用字符串保存 { k=str[j]*3+t;//k保存当前相乘的结果 str[j]=k%10;//当前字符保存为k%10的余数<span style="white-space:pre"> </span> t=k/10;//k/10为下一次字符的进位(可能说的不是太清楚 ,就是如果k>10,由于一个字符只能保存0-9的数,位大于10要进给下一) } } if(r==0||r==1) { if(r==1)//当余数为1,更新m+1=4. m=4; if(r==0)//为0的话,m不变,m=3 m=3; for(j=0,t=0;j<num;j++)//乘以m { k=str[j]*m+t; str[j]=k%10; t=k/10; } } if(r==2)//如果余数为2,分两次计算,分别为乘以3,2 { for(j=0,t=0;j<num;j++)//乘以3 { k=str[j]*3+t; str[j]=k%10; t=k/10; } for(j=0,t=0;j<num;j++)//乘以2 { k=str[j]*2+t; str[j]=k%10; t=k/10; } } for(i=num-1;i>=0;i--)//最后一个不是0的数,标记 if(str[i]!=0) break; for(j=i;j>=0;j--) printf("%d",str[j]); printf("n"); } } return 0; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |