华师一附中OI组
标题:
把1-99的数写成一排,设为X=12345678910111212**99,求X%997
[打印本页]
作者:
admin
时间:
2020-2-10 14:39
标题:
把1-99的数写成一排,设为X=12345678910111212**99,求X%997
此题的基本思想是类似单精度除法,和那个天使的起誓类似。我们把1-99的数字装到一个数组,作为单精度除法的被除数,让它按位去除以997,最后得到的余数就是。
如何装入数组呢?我们用最直观的方法,先把1-9作为一位数装入,再把10-99作为两位数装入。这里可以写一个循环,里面判断一位数还是两位数,也可以分开写成两个循环。
#include <iostream>
using namespace std;
int i,p,x;
int a[210];
int main()
{
for (p=1; p<=9; p++) a[p]=p; ///一位数加进数组
p=9;for (i=10; i<=99; i++)
{
int x1=i/10,x2=i%10;///分离十位个位
a[p+1]=x1,a[p+2]=x2;///加进数组
p=p+2; ///p记录最后一个位置
}
int maxp=p;/// 记录最后一个位置
///输出检查 for(p=1; p<=maxp; p++) cout<<a[p];
///类似单精度除法
x=0;for (p=1; p<=maxp; p++)
{
x=10*x+a[p]; ///被除数
a[p]=x/997;///商,此题其实没有必要记录
x=x%997;///余数
}
cout<<x;
return 0;
}
复制代码
一起处理也可以写成如下
p=1;for (i=1; i<=99; i++)
{
if (i<=9)
{a[p]=i;p++;}///一位数处理
else ///两位数处理
{
int x1=i/10,x2=i%10;///分离十位个位
a[p+1]=x1,a[p+2]=x2;///加进数组
p=p+2; ///p记录最后一个位置
}
}
复制代码
答案是 896
作者:
admin
时间:
2020-2-10 14:41
但是楼上的做法不够精简,被除数我们完全没有必要装进数组保存,直接按规律生成就是,商也没有必要保存。而且,我们还先一次处理完一位数,然后循环一次处理两位,数学可以证明这样是没有问题的。
#include <iostream>
using namespace std;
int i,x;
int main()
{
x=123456789%997;///一位数的余数
for (i=10; i<=99; i++)
{
x=x*100+i;
x=x%997;
}
cout<<x;
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2