永发信息网

c语言怎么解决 这个Time Limit Exceed at Test 1问题

答案:4  悬赏:10  手机版
解决时间 2021-04-04 20:28
  • 提问者网友:沉默的哀伤
  • 2021-04-04 12:49
c语言怎么解决 这个Time Limit Exceed at Test 1问题
最佳答案
  • 五星知识达人网友:洎扰庸人
  • 2021-04-04 14:26
这是考你大整数计算问题,这里做的是1+....+n 求和
(1)大整数用数组表示,此题的数组长度可设置在250,100位的整数平方在200位左右
(2)编写单个数字乘以一个数组的运算
(3)编写两个数组相加的运算
(4)for循环用第2个数的每个位乘以第一个数,并移位,后累加到sum
(5)打印出来即可。

程序嘛,很简单,请自己研究编写

时间上如果想优化,可以根据整数长度选择使用64位整数,或者数组追问做不出来,朋友能帮忙打下吗?追答200分给我,我给你打一下追问可以,用c语言吧,尽量简单点,朋友。追答


#define  OUT

void ZeroArray(int Len, OUT char* dest)
{
for(int i = 0; i < Len; i++)
{
dest[i] = 0;
}
}

void CopyValue(int Len, char* array1, OUT char* dest)
{
for(int i = 0; i < Len; i++)
dest[i] = array1[i];
}

void Text2Array(int Len, char* readLineText, OUT char* dest)
{
int sl = strlen(readLineText);

for(int i = 0; i < Len - sl; i++)
{
dest[i] = 0;
}

for(int i = 0; i < sl; i++)
{
dest[Len - sl + i] = readLineText[i] - '0';
}
}

void SingleMulti(int Len, char* array1, char singleChar, OUT char* result, int rightShift)
{
ZeroArray(Len, result);
int jinWei = 0;

for(int i = Len - 1 ; i >= rightShift; i--)
{
int ji = array1[i] * singleChar + jinWei;
jinWei = ji / 10;
ji = ji % 10;
result[i - rightShift] = ji;
}
}

//字数太多 不让发了,楼主给个追问追问这个好复杂 是我想简单了吗追答
void ArrayAdd(int Len, char* array1, char* array2, OUT char* result)
{
ZeroArray(Len, result);
int jinwei = 0;

for(int i = Len - 1; i >= 0; i--)
{
int he = array1[i] + array2[i] + jinwei;
jinwei = he >= 10 ? 1 : 0;

if(jinwei)
he -= 10;

result[i] = he;
}
}

void Div2Array(int Len, char* array1, OUT char* result)
{
int Yu = 0;

for(int i = 0; i < Len; i++)
{
int Sum = Yu * 10 + array1[i];
result[i] = Sum / 2;
Yu = Sum - result[i] * 2;
}
}
void PrintArray(int Len, char* result)
{
int bFindNz = 0;

for(int i = 0; i < Len; i++)
{
if(result[i] == 0 && !bFindNz)
continue;

bFindNz = 1;
putchar(result[i] + '0');
}

if(!bFindNz)
{
putchar('0');
}

putchar('
');
}

//还有个main函数,其实我就写了20分钟追问怎么这么长。。追答
#define AL 202
int main()
{
char array1[AL];
char line[AL];
char arr_fu_1[AL] = {};
arr_fu_1[AL - 1] = 1;

while(!feof(stdin))
{
gets(line);
Text2Array(AL, line, array1);
char array2[AL];
ArrayAdd(AL, array1, arr_fu_1, array2);
char result[AL];
ZeroArray(AL, result);

for(int i = AL - 1; i >= 0; i--)
{
char temp[AL];
char temp2[AL];
CopyValue(AL, result, temp2);
SingleMulti(AL, array1, array2[i], temp, AL - 1 - i);
ArrayAdd(AL, temp, temp2, result);
}

char result2[AL];
Div2Array(AL, result, result2);
PrintArray(AL, result2);
}

return 0;
}
//这是可以正常运行的,其实没多长,想要当编程高手,一定要善于观察世界规律,数学物理都是不可缺少的,这个程序就是模拟算式运算,其实可以采用16进制储存数据,这样会更快。
//编程10万行,才叫入门,你要不断学习呀!
全部回答
  • 1楼网友:执傲
  • 2021-04-04 15:58
你这代码编译都会有问题!
而且count()函数也没有被调用,这是想实现什么功能 啊追问一定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数。比如10个点可以组成一个等边三角形,因此10是一个三角形数。
输入数据包含多组测试用例。
每组测试用例为一个整数N,长度不超100。
对于每组测试用例,输出对应的三角形数。
这个是我少复制了一段。。while(a!='null'&&count(a)<=100)追答你这个题目需要用到大数加法,C语言本身的数据无法实现这么大的数据:
“每组测试用例为一个整数N,长度不超100。” 这个100是指整数的长度吧!追问
应该是。
追答我看懂题目了,就是我所说的情况:必须引入大数加法。 如:第请说出题目要求追问acm题目
一定数目的点或圆在等距离的排列下可以形成一个等边三角形,这样的数被称为三角形数。比如10个点可以组成一个等边三角形,因此10是一个三角形数。
输入数据包含多组测试用例。
每组测试用例为一个整数N,长度不超100。
对于每组测试用例,输出对应的三角形数。
样例输入
1
2
3
4
5
  • 2楼网友:洎扰庸人
  • 2021-04-04 15:38
把float改为double。%f改为%lf.
#include
float count(float c);
int main()
{
double a,n;
do
{
scanf("%lf",&a);
n=a*(a+1)/2;
printf("%.0lf",n);
printf("\n");
}while(a!='null'&&count(a)<=100);
return 0;
}
float count(float c)
{
float temp,k=0;
temp=c;
while(temp!=0){
k++;
temp=temp/10;
}
return k;
}
  • 3楼网友:春色三分
  • 2021-04-04 14:52

这就是一个等差数列,结果有个公式,不用循环求,例如输入n, 应该输出n*(n+1)/2。但是测试数据太大,所以这道题应该是想要你用数组模拟乘法和加法。。。
 
你这里超时的原因是你输入循环有问题,你这个循环没有办法结束的,你像下面这样写就不会超时,但会WA。。。while (scanf("%f", &a) != EOF) 
{
    n = a * (a + 1) / 2;
    ...
}追问那下面的代码就不需要用scanf输入了对吧追答恩, 下面的不用了...
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯