c语言题目求解惑

寻宝游戏TimeLimit:1000MSMemorylimit:32768KBTotalSubmissions:468Accepted:100Description在银河... 寻宝游戏

Time Limit : 1000 MS Memory limit : 32768 KB
Total Submissions : 468 Accepted : 100

Description

在银河系α星球上存在着一个古老的王国。这个王国的领土呈近似正方形形状。国王格德密斯把全国划分成6×6的相同面积矩形方块来进行管理,每个方块区域设置为一个州,全国共36个州,并按1、2、3…、36来编号(如图所示)。公元2009年3月28日是该王国建国一万周年,国王为了庆祝这一重大事件,决定在全国范围内举行寻宝活动。国王预先派人在这36个州的某些州中秘密埋藏了大量宫中宝藏,并宣布寻到的宝藏归寻宝者本人所有。该活动立即引起了全国民众的积极参与,但由于该王国疆域辽阔,在这36个州中寻宝无异于大海捞针,所以一周时间过去了,一处宝藏都没被发现。国王非常焦急,决定降低寻宝难度,但又不想直接说出宝藏埋藏在哪些州中。于是,他向全国发出通告,告诉全体民众,埋藏宝藏的州的编号对应着他给出的数字的素数因子(当然,该素数因子小于等于36,即如果素数因子大于36,则没有对应的州)。例如给出数字4340,由于4340=2×2×5×7×31,因此意味着宝藏埋藏在第2、5、7、31这四个州中。

Input

输入文件中包含多个测试数据。每个测试数据占一行,为正整数n(2<=n<=10000),为国王提示的正整数。n = 0时,表示输入结束。

Output

针对国王提示每个正整数,按6×6的矩阵格式打印出宝藏分布图。若该州埋藏宝藏,则在相应的矩阵位置打印出“+”,否则打印出“*”,矩阵元素之间有一个空格。每个宝藏分布图之间有一个空行。

Sample Input
4340
170
0

Sample Output
* + * * + *
+ * * * * *
* * * * * *
* * * * * *
* * * * * *
+ * * * * *

* + * * + *
* * * * * *
* * * * + *
* * * * * *
* * * * * *
* * * * * *

Source

ZUFE 2009

#include<stdio.h>
#include<string.h>
int main(){
char a[6][6];
int n,i,j,b,c;
while(scanf("%d",&n),n!=0){
memset(a,'*',sizeof(a));
i=2;
while(n>1){
if(n%i==0){
b=(i-1)/6;
c=(i-1)%6;
a[b][c]='+';
n/=i;
while(n%i==0)
n/=i;
}
i++;
}
for(i=0;i<6;i++){
for(j=0;j<6;j++){
if(j==5)
printf("%c\n",a[i][j]);
else
printf("%c ",a[i][j]);
}
}printf("\n");
}
return 0;
}
总是PE 不知道为什么
展开
 我来答
meliumeng
2012-03-16 · 超过41用户采纳过TA的回答
知道答主
回答量:125
采纳率:0%
帮助的人:112万
展开全部
问题不止一处。
问题代码是while循环:
while(n>1){ /*err1*/
if(n%i==0){ /*err2*/
b=(i-1)/6;
c=(i-1)%6;
a[b][c]='+';
n/=i;
while(n%i==0)
n/=i;
}
i++; /*err3*/
}
首先你的思路是有问题的:为什么while的控制条件是n>1呢,这是非常低效的,假如给你1000组数据,很可能会超时;其次,代码 if(n%i==0){ /*err2*/有问题,你没有保证i是素数;然后,代码 i++; /*err3*/没有保证i在1-36之间。
解决思路:针对素数因子,可以先求出1-36的素数(共10个),保存在数组中,然后用它筛选n就ok了,这样整个程序的时间耗费是10n(每组测试数据有n个),1000ms最多可以处理1000000个数据不超时。
terranlong
2012-03-13 · TA获得超过7294个赞
知道大有可为答主
回答量:2660
采纳率:0%
帮助的人:3958万
展开全部
已改,看注释
#include<stdio.h>
#include<string.h>
int main()
{
char a[6][6];
int n,i,j,b,c;
scanf("%d",&n); //先在这里输入
while(n!=0) //改成n!=0
{
memset(a,'*',sizeof(a));
i=2;
while(n>1)
{
if(n%i==0)
{
b=(i-1)/6;
c=(i-1)%6;
a[b][c]='+';
n/=i;
while(n%i==0)
n/=i;
}
i++;
}
for(i=0;i<6;i++)
{
for(j=0;j<6;j++)
{
if(j==5)
printf("%c\n",a[i][j]);
else
printf("%c ",a[i][j]);
}
}
printf("\n");
scanf("%d",&n); //在这里输入下一次的
}
return 0;
}
更多追问追答
追问
为什么这么改啊,区别在哪里
追答
while里面的条件,只要n为0就退出循环,而判断n前先输入n
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式