算法c语言合集

位数很大的数的计算

有时候需要算出的数据非常大,超出了可定义的范围。可以用这种方法,把数字的每一位都存到数组,然后数组逆序输出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include<stdio.h>
int main() {
int a[1001]= {0},b,c,d,n,i;
a[0]=1;
while(a[5]==0) {
for(i=0; a[i]!=0; i++)
a[i]=a[i]*15;
for(i=0; a[i]!=0; i++)
if(a[i]>9) {
d=a[i]/10;
a[i]=a[i]%10;
a[i+1]=a[i+1]+d;
}
}
for(i=1000; a[i]==0; i--)
i;
for(i; i>=0; i--)
printf("%d",a[i]);
return 0;
}

c语言筛选法求素数

FEBRUARY 4, 2017
使用了动态内存分配,求给定区间里面所有的素数,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<stdlib.h>
#include<stdio.h>
int main() {
int n,i,a,b;
int *p;
scanf("%d",&n);
p=(int *)calloc(n,sizeof(int));
for(i=2; i<=n; i++) {
if(*(p+i)==0)
for(a=2; a*i<=n; a++)
*(p+(a*i))=1;
}
for(i=2; i<=n; i++) {
if(*(p+i)==0)
printf("%d\n",i);
}
return 0;
}

参考了网上的筛选法,自己添加的动态内存。
因为不知道具体操作时候的内存有多大,所以使用了动态内存

c语言判断完全平方数

FEBRUARY 4, 2017

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>
#include<math.h>
int main() {
int n;
scanf("%d",&n);
if(sqrt(n)==(int)sqrt(n))
printf("是完全平方数");
else
printf("不是完全平方数");
return 0;
}

c语言判断身份证号是否正确

FEBRUARY 5, 2017
今天写了一道判断身份证对错的题,才发现身份证也有算法。。怪不得我以前自己乱编身份证不能通过。。
科普一下:

一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下:

首先对前17位数字加权求和,权重分配为:{7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};然后将计算的和对11取模得到值Z;最后按照以下关系对应Z值与校验码M的值:

Z:0 1 2 3 4 5 6 7 8 9 10
M:1 0 X 9 8 7 6 5 4 3 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include<stdio.h>
char bai(int a) {
char c;
c = (12-a)%11+'0';
if(c>'9')
c='X';
return c;
}
int main() {
char a[19];
int c[100]= {0},b=0,n,i,j,q[]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2},sum,z;
printf("请输入18位身份证号码(X为大写):");
scanf("%s",a);
sum=0;
for(j=0; j<17; j++) {
if(a[j]<'0'||a[j]>'9') {
b=1;
break;
}
z=(a[j]-'0')*q[j];
sum+=z;
}
sum=sum%11;
if(bai(sum)!=a[17]) {
b=1;
}
if(!b)
printf("身份证号码正确");
else
printf("身份证号码错误,最后一位应该是 : %c",bai(sum));
return 0;
}

使用代码访问网页

FEBRUARY 9, 2017

1
2
3
4
5
6
7
8
9
10
11
#include<windows.h>
int main() {
system("explorer http://www.baidu.com");
return 0;
}
或者用指定浏览器打开
#include<windows.h>
int main() {
system("start D:/世界之窗/TheWorld6/Application/TheWorld.exe http://www.baidu.com");
return 0;
}

注意事项:在编译器里打开时”/“可能会变成”\”,需要更改成”/“,否则会错误

位数很大的阶层和

FEBRUARY 18, 2017

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<stdio.h>
int main() {
int a[1001],b,c,d,n,i,z[1001];
while(~scanf("%d",&n)) {
for(i=0; i<1001; i++)
z[i]=a[i]=-1;
z[0]=1;
for(b=1; b<=n; b++) {
for(i=0; z[i]!=-1; i++)
z[i]=z[i]*b;
for(i=0; z[i]!=-1; i++)
if(z[i]>9) {
d=z[i]/10;
z[i]=z[i]%10;
if(z[i+1]==-1)
z[i+1]=0;
z[i+1]=z[i+1]+d;
}
for(i=0; z[i]!=-1||a[i]!=-1; i++) {
if(a[i]==-1)
a[i]=0;
a[i]=a[i]+z[i];
}
for(i=0; a[i]!=-1; i++)
if(a[i]>9) {
d=a[i]/10;
a[i]=a[i]%10;
if(a[i+1]==-1)
a[i+1]=0;
a[i+1]=a[i+1]+d;
}
}
for(i=1000; a[i]==-1; i--)
i;
for(i; i>=0; i--)
printf("%d",a[i]);
}
return 0;
}

用链表写出来的超市管理系统

FEBRUARY 27, 2017

写了个大概。功能还不完善。不过已经运用了单向链表的大部分功能了;
下载

用c语言写的简陋的贪吃蛇

MARCH 3, 2017
写了一个贪吃蛇
下载地址

用c语言写的高端贪吃蛇

MARCH 6, 2017
两个文件。可以更改颜色。可以自定义速度,

已知问题:极小概率出现食物出现时卡顿一秒的情况。这个bug暂时无法解决

其他的就没啥了。。有的win10可能编译出来不进入菜单直接进入游戏。。这个我也不知道为啥。。有毒。。
下载地址

更新日志:取消手动改变速度。改为自动加速。每吃一个食物时间缩短2毫秒;
修复了食物出现卡顿的情况,但是会偶先食物消失的情况。可能性极小,如果碰上了可以买彩票了。。不保证中奖。。

后缀表达式

APRIL 7, 2017
后缀表达式用到了数据结构中的堆栈,堆栈的意义就是一个数组先进后出,后缀表达式定义在百度百科

后缀表达式可以让电脑按照算数顺序进行计算

上午我尝试写了写代码,第一次写堆栈,写的好别扭。。不过还好写完了。。测试了几个数据都对。

上代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include<stdio.h>
#include<stdlib.h>
#define MAX 50
struct BOX {
char boxs[MAX];
int num;
};
typedef struct BOX * box;
void out(box head) {
int i;
for(i=0; i<=head->num; i++)
printf("%c",head->boxs[i]);
}
void add(box head,char c) {
head->boxs[++head->num]=c;
}
char put(box head) {
if(head->num==-1)return 'E';
return head->boxs[head->num--];
}
int pd(char c) {
if(c>='0'&&c<='9')
return 1;
return 0;
}
int jibie(char c) {
if(c=='+'||c=='-')
return 1;
if(c=='*'||c=='/')
return 2;
if(c=='(')
return 0;
if(c==')')
return 4;
}
int main() {
box head;
head=(box)malloc(sizeof(box));
head->num=-1;

int sum,s=0,i,flag,c,b=0;
char ch;
char ru[100];

gets(ru);

for(i=0; ru[i]!='\0'; i++) {
flag=pd(ru[i]);

if(flag) {
s=s*10+(ru[i]-'0');
}

else {
if(ru[i]!='('&&ru[i-1]!=')'&&b!=1) {
printf("%d ",s);
s=0;
}
b=0;
if(head->num==-1||ru[i]=='(') {
add(head,ru[i]);
continue;
}
c=jibie(ru[i]);
if(ru[i]==')')
while(1) {
ch=put(head);
if(ch=='(')
break;
putchar(ch);
}
if(head->num==-1||ru[i]==')')
continue;
if(c<=jibie(head->boxs[head->num])&&head->boxs[head->num]!='(') {
ch=put(head);
putchar(ch);
i--;
b=1;
continue;
}
add(head,ru[i]);
}
}
printf("%d",s);
while(head->num!=-1)
putchar(put(head));
return 0;
}

求两个数最大公约数的两种方法

MAY 14, 2017
上代码

1
2
3
4
5
6
7
8
9
int gcd1(int a, int b){
if (b) return gcd1(b,a%b);
return a;
}

int gcd2(int a, int b){
while (b^=a^=b^=a%=b);
return a;
}

c语言版2048

AUGUST 8, 2017
c语言版2048

可能有bug

欢迎反馈

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225

#include <bits/stdc++.h>
#include <conio.h>
#define linemax 4
#define empty -1
#define randnum 10000
#define victory 2048
using namespace std;
int flag,allnum,conflag,victoryflag;
int form[linemax][linemax];
int random() {
return rand()%randnum;
}
void randomnum() {
int i,j,num=allnum;
for(i=0; i<linemax; i++)
for(j=0; j<linemax; j++) {
if(form[i][j]!=empty)
continue;
if(random()<=randnum/num) {
form[i][j]=random()<(randnum/3)?4:2;
allnum--;
return ;
}
num--;
}
allnum--;
}
void welcome() {
int i,j;
for(i=0; i<linemax; i++)
for(j=0; j<linemax; j++)
form[i][j]=empty;
randomnum();
randomnum();
}
void print() {
int i,j;
system("cls");
printf("%d\n",flag++);
for(i=0; i<linemax; i++) {
for(j=0; j<linemax; j++) {
putchar('\t');
if(form[i][j]!=empty)
printf("%d",form[i][j]);
if(form[i][j]==victory)
victoryflag=1;
putchar('.');
}
printf("\n\n");
}
printf("%d\n",allnum);
}
void up() {
int i,j,k;
for(j=0; j<linemax; j++)
for(i=0; i<linemax-1; i++) {
if(form[i][j]==empty) {
for(k=i+1; k<linemax; k++) {
if(form[k][j]!=empty) {
form[i][j]=form[k][j];
form[k][j]=empty;
i--;
conflag=1;
break;
}
}
} else {
for(k=i+1; k<linemax; k++) {
if(form[k][j]!=empty) {
if(form[k][j]==form[i][j]) {
form[i][j]*=2;
form[k][j]=empty;
allnum++;
conflag=1;
}
break;
}
}
}
}
}
void down() {
int i,j,k;
for(j=0; j<linemax; j++)
for(i=linemax-1; i>0; i--) {
if(form[i][j]==empty) {
for(k=i-1; k>=0; k--) {
if(form[k][j]!=empty) {
form[i][j]=form[k][j];
form[k][j]=empty;
conflag=1;
i++;
break;
}
}
} else {
for(k=i-1; k>=0; k--) {
if(form[k][j]!=empty) {
if(form[k][j]==form[i][j]) {
form[i][j]*=2;
form[k][j]=empty;
allnum++;
conflag=1;
}
break;
}
}
}
}
}
void left() {
int i,j,k;
for(i=0; i<linemax; i++)
for(j=0; j<linemax-1; j++) {
if(form[i][j]==empty) {
for(k=j+1; k<linemax; k++) {
if(form[i][k]!=empty) {
form[i][j]=form[i][k];
form[i][k]=empty;
conflag=1;
j--;
break;
}
}
} else {
for(k=j+1; k<linemax; k++) {
if(form[i][k]!=empty) {
if(form[i][k]==form[i][j]) {
form[i][j]+=form[i][k];
form[i][k]=empty;
allnum++;
conflag=1;
}
break;
}
}
}
}
}
void right() {
int i,j,k;
for(i=0; i<linemax; i++)
for(j=linemax-1; j>0; j--) {
if(form[i][j]==empty) {
for(k=j-1; k>=0; k--) {
if(form[i][k]!=empty) {
form[i][j]=form[i][k];
form[i][k]=empty;
j++;
conflag=1;
break;
}
}
} else {
for(k=j-1; k>=0; k--) {
if(form[i][k]!=empty) {
if(form[i][k]==form[i][j]) {
form[i][j]+=form[i][k];
form[i][k]=empty;
allnum++;
conflag=1;
}
break;
}
}
}
}
}
int jiancha() {
int i,j,e,k,i1;
int ar[4][2]= {1,0,0,1,-1,0,0,-1};
for(i=0; i<linemax; i++)
for(j=0; j<linemax; j++) {
for(i1=0; i1<4; i1++) {
e=ar[i1][0]+i;
k=ar[i1][1]+j;
if(e<0||k<0||e>=linemax||k>=linemax)
continue;
if(form[i][j]==form[e][k])
return 0;
}
}
return 1;
}
void over() {
printf("你失败了\n游戏结束");
}
int main() {
flag=0;
victoryflag=0;
conflag=0;
srand(time(NULL));
allnum=16;
welcome();
print();
char get;
while(1) {
get=getch();
if(get=='w')
up();
else if(get=='s')
down();
else if(get=='a')
left();
else if(get=='d')
right();
if(conflag) {
randomnum();
conflag=0;
}
print();
if(victoryflag) {
printf("你赢了666");
break;
}
if(!allnum) {
if(jiancha()) {
over();
break;
}
}
}
return 0;
}

星期计算

APRIL 27, 2018
给定一个2011年11月11日是星期五

然后给定一个别的日期,算算是星期几

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include<stdio.h>
//判断是不是闰年
int isrun(int year) {
return (year%100!=0&&year%4==0||year%400==0)?1:0;
}
//判断一个年份有几天
int num_year(int year) {
return 365+isrun(year);
}
//到1月1日的天数
int init_year(int year,int mon,int day) {
int lis_mon[]= {31,28,31,30,31,30,31,31,30,31,30,31};
lis_mon[1]+=isrun(year);
int i,ans=0;
for(i=1; i<mon; i++) {
ans+=lis_mon[i-1];
}
ans=ans+day-1;
return ans;
}
void swap(int &a,int &b) {
int c;
c=a;
a=b;
b=c;
}

//传入两个日期,前一天小于后一天返回1,否则返回-1
int format(int year1,int mon1,int day1,int year2,int mon2,int day2) {
int a1=year1*10000+mon1*100+day1;
int a2=year2*10000+mon2*100+day2;
int c;
if(a1<=a2)
return 1;
return -1;
}
int abs(int a) {
return a>0?a:-a;
}
//传入一个星期,再传入一个相隔几天,num负数表示星期we的前num天是星期几
int getweek(int we,int num) {
int ans=0;
if(num>=0)
ans=(we+num)%7;
else {
num=-num;
if(we>num)
ans=we-num;
else
ans=7-(abs(we-num)%7);
}
if(ans==0)
ans=7;
return ans;
}
int main() {
int year,mon,day,myear=2011,mmon=11,mday=11,week=5;
scanf("%d %d %d",&year,&mon,&day);
int c=format(myear,mmon,mday,year,mon,day);
if(c==-1){
swap(myear,year);
swap(mmon,mon);
swap(mday,day);
}
int c1=init_year(myear,mmon,mday),i;
int c2=init_year(year,mon,day);
int ans=0;
for(i=myear; i<year; i++) {
ans+=num_year(i);
}
ans=c*(ans-c1+c2);
printf("%d",getweek(week,ans));
return 0;
}