C语言的一道题 求指点

#include<stdio.h>intmain(){unsignedshorta,b;unsignedn;doublec;scanf("%d",&n);for(;n>=... #include <stdio.h>

int main()
{
unsigned short a,b;
unsigned n;
double c;
scanf("%d",&n);
for(;n>=1;n--)
{
scanf("%hd%hd",&a,&b);
for(c=0.001;b>=1;b--)
{
c=c*a;
if(c>=1)
{
c=c-(int)(c);
}
}
printf("%d\n",(int)(c*1000));
}
}

题目描述

求A^B的最后三位数表示的整数(1<=A,B<=1000)

输入

n个测试实例,每个实例给出两个正整数A,B

输出

输出A^B的最后三位(没有前导0)
样例输入
2
2 3
12 6

样例输出
8
984

这道题我觉得我的算法没毛病啊,为什么提交总是提示错误!流泪!求解析一下我的答案及正确答案应该是?

而且!#include <stdio.h>

int main()
{
unsigned short a,b,d,p;
unsigned n;
int c;
scanf("%d",&n);
for(;n>=1;n--)
{
scanf("%hd%hd",&a,&b);
p=a;
for(c=1;b>=1;b--)
{
c=c*a;
d=c%1000;
}
printf("%d\n",d);
}
}这段是错的,但是
#include <stdio.h>

int main()
{
unsigned short a,b,d;
unsigned n;
int c;
scanf("%d",&n);
for(;n>=1;n--)
{
scanf("%hd%hd",&a,&b);
for(c=1;b>=1;b--)
{
c=c%1000;
c=c*a;
}
printf("%d\n",c%1000);
}
}

就对了!!!求解!流泪!
展开
 我来答
风若远去何人留
2017-11-01 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450103
专业C/C++软件开发

向TA提问 私信TA
展开全部
第一个代码, 你需要知道double每个数字都是近似存储的,虽然有前若干位是准确数字的说法,但实际上除了恰好是2^n组合的加法情况,其他的多少都会有一些近似.
这样在大量计算累积下来就会导致精度丢失的扩大. 最终导致结果错误.
第二个代码.
如果把c改成int应该是可以过的.
现在c是short 这样在做c=c*a; 的时候就可能会溢出.
比如 a=999; 计算第二次的时候 c=998001, 但最大值只是32767,所以实际上得到的c值是14961 取余后结果是961,明显和正确答案001差太多了.
更多追问追答
追问
可是第二段的代码中的c是int型的啊
追答
正确的代码,c在乘之前做了模除 ,控制了范围,所以不会溢出. 
关于这个修改,刚看错了, 这里还是必须通过加一个模除,来限制范围,即
c=c*a%1000;
不然a不断的累乘到c上, 就算int也会溢出的.
听不清啊
高粉答主

2017-11-01 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部
#include <stdio.h>
int main()
{int n,a,b,c;
scanf("%d",&n);
for(;n>=1;n--)
{
scanf("%d%d",&a,&b);
for(c=1;b>=1;b--)
  c=c*a%1000;
printf("%d\n",c);
}
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式