确实写不出,数据远超过64位,难道用数组存吗,但是不好计算,想到的思路是取模,一边计算,一边取模,就不会超过数据范围,但是数学原理没懂,所以做不出来
看了下自己以前写的博客,确实是取模,以后积累经验,就是如果超过了数据范围,就直接用取模运算来控制这个范围
#include<stdio.h>
#include<stdbool.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int m;
scanf("%d",&m);
int k=1;
int cnt=1;
bool flag=false;
for(int i=1;i<1000000;i++)
{
k%=m;
if(k==0)
{
printf("%d\n",cnt);
flag=true;
break;
}
k=k*10+1;
cnt++;
}
if(!flag) puts("0");
}
return 0;
}
看自己博客又敲了一遍,WA了一次,因为我把循环的上界设置为了输入的数字,但是是不可取的,好吧,又试了一下,把上界设成输入的数字,取到等于号就可以过了
样例能过,但是WA,实在想不通
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int cnt1=0,cnt2=0;
while(n!=1)
{
int temp=n%2;
int m=n-temp;
m/=2;
cnt1++;
cnt2+=m;
n=n-m;
}
printf("%d %d\n",cnt1,cnt2);
}
return 0;
}
确实是自己没有考虑到位,应该是没有考虑需要比赛的人数是偶数的情况,先补上一份按照之前博客写的代码,再看下能不能把上面的代码改对
#include<stdio.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int cnt1=0,cnt2=0;
int m=0;
while(n>1)
{
m=1;
while(m<n) m*=2;
if(m!=n) m/=2;
cnt1++;
cnt2+=m/2;
n=n-m/2;
}
//printf("%d\n",m);
printf("%d %d\n",cnt1,cnt2);
}
return 0;
}
改了一下还是改不出来,想不明白