为给定测试用例查找阶乘的程序
Program to find factorials for given test cases
输入
一个整数t,1<=t<=100,表示测试用例的数量,后面是t行,每行包含一个整数n,1<=n<=100.
输出
对于输入中给定的每个整数 n,显示一行值为 n!
我输入了下面的代码,但它没有被 codechef 接受。
不知道为什么。
#include<stdio.h>
double fact(int n);
void disp(double t);
int main() {
int a, i, c[100];
scanf("%d", &a);
for (i = 0; i < a; i++) {
scanf("%d", &c[i]);
}
for (i = 0; i < a; i++) {
disp(fact(c[i]));
}
return 0;
}
double fact(int n) {
double f;
if (n == 1 || n == 0)
f = (double) 1;
else
f = (double) n * fact(n - 1);
return f;
}
void disp(double t) {
printf("%f\n", t);
}
I have typed the code below and it doesn't get accepted on codechef.
I don't know why.
OP 的代码失败,因为 double
对此任务缺乏准确性。给定 "containing a single integer n, 1<=n<=100." 和 fact(100)
,打印结果需要比 double
.
提供的精度高得多
100!正是
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
double
(精度)和 uint64_t
(范围)都不足以完成此任务。需要新的方法。扩展精确整数乘法的东西。
也许创建一个函数来乘以 字符串? mult_str(char *s, int n)
? "1"
* 2 --> "2"
。
无需特殊库,大约 30 行 C 代码即可完成。
这似乎是一个有趣的小程序,所以我将其编写并提交给了 CodeChef。它在第一次尝试时就被接受了——对于 BOTE(信封背面)代码来说还不错。
/* FCTRL2.c
CodeChef Problem Code: FCTRL2 (Small Factorials)
*/
#include <stdio.h>
#define LEN 158
int nextFactorial (const int n, char fact[], int limit)
{
int carry = 0;
for ( int index = LEN - 1; index >= limit; --index ) {
int product = fact[index] * n + carry;
fact[index] = product % 10;
carry = 0;
if ( product > 9 ) {
carry = product / 10;
if ( index == limit )
--limit;
}
}
return limit;
}
void displayFactorial (const char fact[], const int limit)
{
for ( int index = limit; index < LEN; ++index )
printf ("%c", fact[index] + '0');
printf ("\n");
}
int main (void)
{
int count;
scanf ("%i", &count);
int n[count];
for ( int i = 0; i < count; ++i )
scanf ("%i", &n[i]);
for ( int i = 0; i < count; ++i ) {
char fact[LEN] = { [LEN - 1] = 1 };
int limit = LEN - 1;
for ( int j = 2; j <= n[i]; ++j )
limit = nextFactorial (j, fact, limit);
displayFactorial (fact, limit);
}
return 0;
}
输入
一个整数t,1<=t<=100,表示测试用例的数量,后面是t行,每行包含一个整数n,1<=n<=100.
输出
对于输入中给定的每个整数 n,显示一行值为 n!
我输入了下面的代码,但它没有被 codechef 接受。
不知道为什么。
#include<stdio.h>
double fact(int n);
void disp(double t);
int main() {
int a, i, c[100];
scanf("%d", &a);
for (i = 0; i < a; i++) {
scanf("%d", &c[i]);
}
for (i = 0; i < a; i++) {
disp(fact(c[i]));
}
return 0;
}
double fact(int n) {
double f;
if (n == 1 || n == 0)
f = (double) 1;
else
f = (double) n * fact(n - 1);
return f;
}
void disp(double t) {
printf("%f\n", t);
}
I have typed the code below and it doesn't get accepted on codechef.
I don't know why.
OP 的代码失败,因为 double
对此任务缺乏准确性。给定 "containing a single integer n, 1<=n<=100." 和 fact(100)
,打印结果需要比 double
.
100!正是
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
double
(精度)和 uint64_t
(范围)都不足以完成此任务。需要新的方法。扩展精确整数乘法的东西。
也许创建一个函数来乘以 字符串? mult_str(char *s, int n)
? "1"
* 2 --> "2"
。
无需特殊库,大约 30 行 C 代码即可完成。
这似乎是一个有趣的小程序,所以我将其编写并提交给了 CodeChef。它在第一次尝试时就被接受了——对于 BOTE(信封背面)代码来说还不错。
/* FCTRL2.c
CodeChef Problem Code: FCTRL2 (Small Factorials)
*/
#include <stdio.h>
#define LEN 158
int nextFactorial (const int n, char fact[], int limit)
{
int carry = 0;
for ( int index = LEN - 1; index >= limit; --index ) {
int product = fact[index] * n + carry;
fact[index] = product % 10;
carry = 0;
if ( product > 9 ) {
carry = product / 10;
if ( index == limit )
--limit;
}
}
return limit;
}
void displayFactorial (const char fact[], const int limit)
{
for ( int index = limit; index < LEN; ++index )
printf ("%c", fact[index] + '0');
printf ("\n");
}
int main (void)
{
int count;
scanf ("%i", &count);
int n[count];
for ( int i = 0; i < count; ++i )
scanf ("%i", &n[i]);
for ( int i = 0; i < count; ++i ) {
char fact[LEN] = { [LEN - 1] = 1 };
int limit = LEN - 1;
for ( int j = 2; j <= n[i]; ++j )
limit = nextFactorial (j, fact, limit);
displayFactorial (fact, limit);
}
return 0;
}