-
Notifications
You must be signed in to change notification settings - Fork 0
/
little_trick
174 lines (129 loc) · 4.09 KB
/
little_trick
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
#include <stdio.h>
//------------------------------------------求最大公约数与最小公倍数--------------------------
//细节:1、因为a和b要变,所以要先用p存取a*b的值,最后p/a是为求最小公倍数。求a与b的最大公倍数的方法是a*b/(a、b的最大公约数)
// 2、跳出循环的条件是b不为0,即除数不为0
int main()
{
int a,b,r;
scanf("%d %d",&a,&b);
if(a<b)
{
int temp = a;
a = b;
b = temp;
}
int p = a*b; //细节1
while(b!=0) //细节2
{
r = a%b;
a = b;
b = r;
}
printf("divisor = %d,mutipule=%d",a,p/a);
return 0;
}
//-------------------------------------统计单词个数--------------------------------------
//使用w,相当于上锁的过程,当str不为‘ ’时,遇到第一个就把w设为1,之后再遇到不为‘ ’时,sum不会+1
//直到再次遇到‘ ’,再解锁
//gets不够安全,要fgets(*buffer,int length,*input)才安全
//
#include <stdio.h>
int main() {
char str[255]={0};
//gets(str);//使用gets可将带空格的整行字符串读入
fgets(str,254,stdin); //fgets包含最后的'\0',最多录入254-1个显式字符串
int w=0,sum=0;
for(int i=0;str[i]!='\0';i++){
if(str[i]!=' '){
if(w==0){
w=1;
sum++;
}
}
else{
w=0;
}
}
printf("%d",sum);
return 0;
}
//-------------------------------------------杨辉三角------------------------------
//注意动态声明二维数组。用该方法生成杨辉三角,不损失空间
//杨辉三角的规律是从第三行起,除去第一列和最后一列,其余元素为i-1行j-1列和i-1行j列之和
#include <stdio.h>
#include <stdlib.h>
int main() {
int N,i,j;
scanf("%d",&N);
int **yanghui_triangle = (int **)malloc(N*sizeof(int *)); //直接int yh_triangle[N][N]={1}是错误的
for(i = 0;i<N;i++)
{
yanghui_triangle[i] = (int *)malloc((i+1)*sizeof(int));
}
//initiate yanghui_triangle
for(i = 0;i<N;i++)
{ for(j = 0;j<=i;j++)
{
yanghui_triangle[i][j] = 1;
}
}
for(i = 2;i<N;i++)
{
for(j = 1;j<i;j++)
{
yanghui_triangle[i][j] = yanghui_triangle[i-1][j-1]+yanghui_triangle[i-1][j];
}
}
//show yanghui_triangle
for(i = 0;i<N;i++)
{ for(j = 0;j<=i;j++)
{
printf("%d\t",yanghui_triangle[i][j]);
}
printf("\n");
}
return 0;
}
//-----------------------------------------汉诺塔---------------------------------------
//经典递归题,运用递归:1、找出递归终止条件,即n为1时
#include <stdio.h>
#include <stdlib.h>
#define print(a,b) printf("%d-->%d\n",a,b) //用define来宏定义一个函数
void move(int n,int start,int temp,int end)
{
if(n == 1)
{
print(start,end);//这里的print实际上就是移动。当n为1时,直接从start移动到end即可
}
else
{
move (n-1,start,end,temp); //1、将其上方的n-1块通过end作为中转移动到temp处
print(start,end); //2、将暴露在最上方的第n块直接移动到end处
//move(n-1,temp,end,start);//3、n-1个在temp,所以temp作为start,经过end作为temp移动到start处
move(n-1,temp,start,end);//3、n-1个在temp,所以temp作为start,以目标为导向,最后是要在end,所以以start为temp移动到end
}
}
int main() {
int n;
scanf("%d",&n); //输入的是原始汉诺塔的个数
move(n,1,2,3);//1号柱为start,2号柱为temp,3号柱为end
return 0;
}
//------------------------------------回文数---------------------------
//用首尾双指针,往中间靠来比较
int main() {
char a[255];
fgets(a,255,stdin);
int len = strlen(a);
int start=0,tail=len-2;//特别注意:fgets()函数会将最后的换行符也读入,所以strlen会比实际长度多一位
for(;start<len/2;start++,tail--)
{
if(a[start]!=a[tail])
{
printf("it is not \n");
return 0;
}
}
printf("yes,it is ");
return 0;
}