数据太大,超出范围了,怎么办???

a542107840 2010-08-10 09:17:58
火星明年举办火星杯足球赛;每一个足球队的队员人数要求刚好11;有很多很多的人要求参加比赛,你能不能刚好让每个人都能参加比赛? 约束条件:(1)一个人能够参加比赛的条件是他刚好是11个人之一;(2)一个人只能参加一支球队;

每一行只有一个正整数n, 表示人数; (n 可能很大, 但最大位数不超过 4000000 位);

对于每一个n, 独立一行输出答案;每个人都能参加比赛, 输出 YES; 否则输出 NO;

Sample Input
11
121
1
2

Sample Output
YES
YES
NO
NO

题目的链接http://acm.nit.net.cn/showproblem.jsp?pid=1034
我写的程序:
#include<stdio.h>
int main()
{
int n; //这样定义肯定不行,它数据太大,哪位高手指点一下巧妙的办法来处理这个问题!!!!
while(scanf("%d",&n)!=EOF)
{
if(n%11==0)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
...全文
930 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Rex237 2010-08-10
  • 打赏
  • 举报
回复
也可以直接用大数除法,判断余数,不过那样效率较低。
Jim_King_2000 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cw7600 的回复:]

把int改成long
如果long还不行就改为unsigned long//这个只能是正数
这个还不行的话 就用2个long来拼接~
[/Quote]
在Windows上,无论是32位还是64位,long都是32位的,跟int一样长。而在Mac上,32位Mac long是32位,64位Mac long是64位。所以long会有移植性问题,尽量不要用long。
Rex237 2010-08-10
  • 打赏
  • 举报
回复
能被11整除的数的特征
  把一个数由右边向左边数,将奇位上的数字与偶位上的数字分别加起来,再求它们的差,如果这个差是11的倍数(包括0),那么,原来这个数就一定能被11整除.
  例如:判断491678能不能被11整除.
  —→奇位数字的和9+6+8=23
  
  —→偶位数位的和4+1+7=12  23-12=11
  因此,491678能被11整除.
  这种方法叫“奇偶位差法”.
  除上述方法外,还可以用割减法进行判断.即:从一个数里减去11的10倍、20倍、30倍……到余下一个100以内的数为止.如果余数能被11整除,那么,原来这个数就一定能被11整除.
  又如:判断583能不能被11整除.
  用583减去11的50倍(583-11×50=33)余数是33, 33能被11整除,583也一定能被11整除。


代码:

unsigned char n[40001]; //用数组记录人数,从n[1]开始
int len; //记录人数数组的长度
int i, diff;
int odd_sum, even_sum; //从右向左数奇数位和,偶数位和
...//读入过程略
odd_sum = 0;
even_sum = 0;
for(i=1; i<=len; i++)
{
if(i % 2 == 1)
odd_sum += n[i];
else
even_sum += n[i];
}

diff = odd_sum - even_sum;

if(diff % 11 == 0)
printf("YES\n");
else
printf("NO\n");



bobo364 2010-08-10
  • 打赏
  • 举报
回复
貌似输入2^32-1都行吧
#include<stdio.h>
int main()
{
unsigned int n; //这样定义肯定不行,它数据太大,哪位高手指点一下巧妙的办法来处理这个问题!!!!
while(scanf("%d",&n)!=EOF)
{
if(n%11==0)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
}
system("pause");
return 0;
}
lijianbin9 2010-08-10
  • 打赏
  • 举报
回复
貌似 string 方法解决 比较合适!!
http://topic.csdn.net/u/20100802/15/8da54cbc-fa26-4aaf-b81f-7e01481e8f8e.html 你看看对你 有帮助没!!

http://zhishi.sogou.com/question/95819286.html
cw7600 2010-08-10
  • 打赏
  • 举报
回复
把int改成long
如果long还不行就改为unsigned long//这个只能是正数
这个还不行的话 就用2个long来拼接~
xy_zhang 2010-08-10
  • 打赏
  • 举报
回复
真没看懂为啥不行……

是说如果n超过4000000就应该报错吗?那就在while循环里面判断一下好了。
a542107840 2010-08-10
  • 打赏
  • 举报
回复
是啊![Quote=引用 8 楼 studyall123 的回复:]
n 可能很大, 但最大位数不超过 4000000 位?
你这是指10进制吗?
[/Quote]
bobo364 2010-08-10
  • 打赏
  • 举报
回复
5楼,你那办法不错,不知可否推广一下求任何整数整除的特性哪
不想低调 2010-08-10
  • 打赏
  • 举报
回复
n 可能很大, 但最大位数不超过 4000000 位?
你这是指10进制吗?

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧