69,381
社区成员
发帖
与我相关
我的任务
分享
94269.........313
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
int n;
struct node * next;
} NODE;
NODE * jc(int);
void print(NODE *);
void blj(NODE *, NODE *);
NODE * newnode(int n) ;
int main()
{
NODE * head = newnode(0);
NODE * temp = NULL;
int x = 0;
printf("输入计算多少内的阶乘之和:");
scanf("%d", &x);
for(int n = 1; n <= x; ++n){
temp = jc(n);
blj(head, temp);
print(temp);
//print(jc(n));
printf("\n");
}
printf("\n1到%d的阶乘各(包括%d)是:", x, x);
print(head);
printf("\n");
return 0;
}
void print(NODE * head) {
if(head) {
print(head->next);
printf("%1d", head->n);
free(head);
}
}
NODE * newnode(int n) {
NODE * head;
head = (NODE *)malloc(sizeof(NODE));
head->n = n;
head->next = NULL;
return head;
}
void jw(NODE * head, long n) {
if(n>0) {
int x = head->n + n%10;
head->n = x%10;
if((x>=10 || n>=10) && head->next == NULL) head->next = newnode(0);
jw(head->next, x/10);
jw(head->next, n/10);
}
}
void blj(NODE * head, NODE * temp) {
if(temp) {
jw(head, temp->n);
if(head->next == NULL && temp->next) head->next = newnode(0);
blj(head->next, temp->next);
//(head->next == NULL && temp->next) ? blj((head->next = newnode(0)), temp->next) : blj(head->next, temp->next);
}
}
NODE * lj(NODE * head, int n) {
if(head) {
lj(head->next, n);
long x = head->n * n;
head->n = 0;
jw(head, x);
}
return head;
}
NODE * jc(int n) {
return n==1 ? newnode(1) : lj(jc(n-1), n);
}
#include <iostream>
#include <string>
#include <time.h>
using namespace std;
int COMPARE(string number1, string number2)
{
int j;
int length1 = number1.size();
int length2 = number2.size();
if(number1.size() == 0) number1 = "0";
if(number2.size() == 0) number2 = "0";
j = 0;
for(int i = 0; i < length1; ++i)
{
if(number1[i] == '0') ++j;
else break;
}
number1 = number1.substr(j);
j = 0;
for(int i = 0; i < length2; ++i)
{
if(number2[i] == '0') ++j;
else break;
}
number2 = number2.substr(j);
length1 = number1.size();
length2 = number2.size();
if(length1 > length2)
{
return 1;
}
else if(length1 == length2)
{
if(number1.compare(number2) > 0)
{
return 1;
}
else if(number1.compare(number2) == 0)
{
return 0;
}
else
{
return -1;
}
}
else
{
return -1;
}
return 0;
}
string PLUS(string number1,string number2)
{
int i;
int length1 = number1.size();
int length2 = number2.size();
string result="";
reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());
for(i = 0; i < length1 && i < length2; i++)
{
char c = (char)(number1[i] + number2[i] - 48);
result = result + c;
}
while(i < length1)
{
result = result + number1[i];
++i;
}
while(i < length2)
{
result = result + number2[i];
++i;
}
int carry = 0;
for(i = 0; i < (int)result.size(); ++i)
{
int value = result[i] - 48 + carry;
result[i] = (char)(value % 10 + 48);
carry = value / 10;
}
if(carry !=0 )
{
result = result + (char)(carry + 48);
}
for(i = result.size() - 1; i >= 0; i--)
{
if(result[i] != '0') break;
}
result = result.substr(0, i + 1);
reverse(result.begin(), result.end());
if(result.length() == 0) result = "0";
return result;
}
string MINUS(string number1,string number2)
{
int i;
string result = "";
int length1 = number1.size();
int length2 = number2.size();
if(COMPARE(number2,number1) > 0)
{
return "-" + MINUS(number2, number1);
}
reverse(number1.begin(),number1.end());
reverse(number2.begin(),number2.end());
for(i = 0; i < length1 && i < length2; i++)
{
char c = number1[i] - number2[i] + 48;
result = result + c;
}
if(i < length1)
{
for(; i < length1; i++)
{
result = result + number1[i];
}
}
int carry = 0;
for(i = 0; i < (int)result.length(); i++)
{
int value = result[i] - 48 + carry;
if(value < 0)
{
value = value + 10;
carry = -1;
}
else carry = 0;
result[i]=(char)(value + 48);
}
for(i = result.size() - 1; i >= 0; i--)
{
if(result[i] != '0')break;
}
result = result.substr(0, i+1);
reverse(result.begin(), result.end());
if(result.length()==0) result = "0";
return result;
}
string MULTIPLY(string number1, string number2)
{
int i, j;
int *iresult;
int length1 = number1.size();
int length2 = number2.size();
string result = "";
reverse(number1.begin(), number1.end());
reverse(number2.begin(), number2.end());
iresult = (int*)malloc(sizeof(int) * (length1 + length2 + 1));
memset(iresult, 0, sizeof(int) * (length1 + length2 + 1));
for(i = 0; i < length1; i++)
{
for(j = 0; j < length2; j++)
{
iresult[i+j] += ((number1[i] - 48) * (number2[j] - 48));
}
}
int carry = 0;
for(i = 0; i < length1 + length2; i++)
{
int value = iresult[i] + carry;
iresult[i] = value % 10;
carry = value / 10;
}
for(i = length1 + length2 - 1; i >= 0; i--)
{
if(iresult[i] != 0)break;
}
for(; i >= 0; i--)
{
result = result + (char)(iresult[i]+48);
}
free(iresult);
if(result == "") result = "0";
return result;
}
string factorial(string n)
{
string temp = "1";
string i;
for(i = "1"; COMPARE(i, n) <= 0; i = PLUS(i, "1"))
{
temp = MULTIPLY(temp, i);
}
return temp;
}
int main(void)
{
string i;
string result = "0";
string N = "100";
for(i = "1"; COMPARE(i, N) <= 0; i = PLUS(i, "1"))
{
result = PLUS(result, factorial(i));
}
cout << result << endl;
return 0;
}