/*
题目来源:https://leetcode-cn.com/problems/palindrome-number/
*/
bool isPalindrome(int x){
int s, n = x;
long int sum = 0; //!sum初始值设为0
while(n > 0){
s = n%10; //弹出个位
n /= 10; //弹出个位后剩余的值
sum = sum*10 + s;
}
if(sum == x) return true;
return false;
}
/*
不借助其他变量
*/
void main()
{
int a,b;
scanf("%d%d", &a, &b);
printf("before swap: a=%d, b=%d\n", a, b);
a = a + b;
b = a - b;
a = a - b;
printf("after swap: a=%d, b=%d\n", a, b);
}
void fun(char a[]){
//先找到不为*的第一个字符的位置
int i,j;
i = j = 0;
while(a[i]=='*') ++i;
//依次向前部分赋值
while(a[i]!='\0'){
a[j] = a[i];
i++;
j++;
}
a[j] = '\0'; //!别忘记写这步了。
}
void main()
{
char s[81];
printf("input a string:");
gets(s);
fun(s);
printf("the string after deleted!");
printf("\n");
puts(s);
}
/*
思路:首先输入两个整数m和n;
用m取余于n,将余数赋给r,如果r等于0,则n是最大公因子,算法结束,否则执行下一步;
把n赋值给m,把r赋值给n,转到上一步。
!若题目让求最小公倍数,则最小公倍数为(m*n)/最大公因子
*/
//1:非递归写法
void main()
{ //m为较大数,n为较小数
int m, n, r;
printf("please input two positive integer:");
scanf("%d%d", &m, &n);
while(n != 0){
r = m % n;
m = n;
n = r;
}
printf("Their greatest common divisor is %d\n", m);
}
//2:递归写法
int f(int m, int n){
if(n==0) return m;
else return f(n,m%n);
}
void main(){
char c;
while(1){
c = getchar(); //获取一个字符
if(c>='a' && c<='z')
putchar(c-'a'+'A');
else break; //不是小写字母
}
}
/*
素数:除了能被1和它本身整除以外不能被任意整数整数的数。
*/
bool isPrimeNumber(int n){
int i, k;
k = sqrt(n);
for(i=2; i<=k; ++i){
if(n%i==0) return false;
}
return true;
}
/*
方法:暴力循环
*/
bool isPrimeNumber(int n){
int i, k;
k = (int)sqrt(n);
for(i=2; i<=k; ++i){
if(n%i==0) return false;
}
return true;
}
void main()
{
int n, p, q, pFlag, qFlag;
p = 1;
pFlag = qFlag = 0;
printf("Please input n:");
scanf("%d", &n);
if(n<4 || n%2!=0){ //如果该数不是偶数
printf("Input data error!\n");
exit(-1);
}
while(pFlag*qFlag==0){ //当其中一个不为素数时
p++;
q = n-p;
pFlag = isPrimeNumber(p);
qFlag = isPrimeNumber(q);
}
printf("%d=%d+%d\n", n, p, q);
}
/*
pai/4 ≈1-1/3+1/5-1/7.....
要求累加到最后一项小于10^-6次方
*/
void main()
{
int s = 1; //控制正负
float n=1.0, t=1, pi=0; //n为对应的分母, t本次循环待加上的值
while(fabs(t) >= 1e-6){
pi += t; //本轮加上
//计算下轮待加上的值
n += 2;
s = -s;
t = s/n;
}
pi *= 4;
printf("pi = %.6f\n", pi); //保留小数点后6位
}
void main()
{
int i,n=1,sum=0; //n:当前阶层值
for(i=1; i<=10; ++i){
n *= i;
sum += n;
}
printf("%d", sum);
}
void main()
{
int x ,n ,sum=0;
scanf("%d", &x);
n = x; //n:临时变量
while(n!=0){
sum += n%10;
n /= 10;
}
printf("%d", sum);
}
void main()
{
int x ,n, r, sum=0; //!sum初始值为0
scanf("%d", &x);
n = x;
while(n!=0){
r = n%10; //弹出最后一位
sum = sum*10+r;
n /= 10;
}
if(sum==x) printf("该数为回文数");
else printf("该数不为回文数");
}
/*
用一元五角人民币兑换5分、2分和1分的硬币(每一种都要)共一百枚,问共有集中兑换方法。
*/
void main()
{
int x, y, z, count=0; //x、y、z分别为三种钱的个数
for(x=1; x<=29; ++x){ //5分的最多兑29枚
for(y=1; y<=72; ++y){ //2分最多兑72枚
z = 100-x-y;
if(5*x+2*y+z == 150){
++count;
printf("%02d,%02d,%02d ",x,y,z);
if(count%6 == 0){
printf("\n");
}
}
}
}
printf("count=%d\n", count);
}
/*
题目:4个同学做好事不留名,校长问是谁做的好事:
A说:不是我。
B说:是C。
C说:是D。
D说:他胡说。
已知3个人说的是实话,一个人说的是假话。
思路:依次假设做好事的人是A、B、C、D
然后根据判定条件判断,若满足其中三个,则该人就是说实话的人
*/
void main()
{
int k, sum=0, g=0;
char thisman; //做好事的人
for(k=0; k<=3; ++k){
thisman = 'A'+k;
sum = (thisman!='A')+(thisman=='C')+(thisman=='D')+(thisman!='D');
if(sum==3){ //因为其中有三个人说的是实话,所以判断条件是sum为3
printf("This man is %c\n", thisman);
g = 1;
}
}
if(g!=1) printf("这个人未找到!");
}
/*
思想:用26数组存储各字符个数
*/
void main()
{
char ch;
int i,num[26] = {0}; //初始化每个字母的个数为0,索引0对应的字符A,依次类推
while((ch=getchar())!='\n'){
if(ch>='A' && ch<='Z'){
num[ch-'A']++;
}
}
for(i=0; i<26; ++i){
printf("%c(%d) ",'A'+i,num[i]);
}
}
/*
题目描述:输入一行字符,统计其中单词的个数,单词之间用空格隔开
*/
void main()
{
char string[80], c;
int i, num=0, flag=0;
gets(string);
for(i=0; (c=string[i])!='\0'; ++i){
if(c==' ') flag=0; //关键
else{
if(flag==0){
++num;
flag=1;
}
}
}
printf("There are %d words in the line\n", num);
}
/*
题目描述:比如100到105之间有100,101,102,103,104,105六个数,则0出现的个数为7次,
1出现的个数为7次,2、3、4、5出现的次数各为1次。
思想:因为输入两个整数均不超过8位数,因此用两个长整型存储它们,然后通过循环将每次得到
的整数使用sprintf函数将其转换成8个字符的字符串存储在字符数组str中,字符串不足8位的
部分补空格字符,再对str中每个字符进行统计。数字出现的次数可以定义一个长整型数组count
来表示,其大小位10,count[0]存储0出现的次数,count[1]存储1出现的次数......
*/
void main()
{
long k, min, max ,count[10]={0};
char str[9];
int i;
//输入最大最小值
printf("input the first number:");
scanf("%ld", &min);
printf("input the lat number:");
scanf("%ld", &max);
if(min>max){
printf("input error!");
return;
}
//统计各数字出现的次数
for(k=min; k<=max; ++k){
sprintf(str, "%8d", k); //将数字转化为字符串,存入str中
for(i=7; i>=0 && str[i]!=' '; --i){ //!是倒着遍历,因为字符串不足八位前面补空格符,如果直接遍历,可能出现for循环不执行的情况,因为表达式2要求str[i]!=' '
count[str[i]-'0']++;
}
}
//显示输出结果
for(i=0; i<10; ++i){
printf("%d--(%ld) ",i,count[i]);
if(i==4) printf("\n");
}
}
void main(){
int i,j,temp,arr[5]={4,2,5,4,11};
i=j=0; //i为慢指针,j为快指针
for(j=0;j<5;++j){
if(arr[i]%2==0){ //当i指向的元素是奇数时
if(arr[j]%2!=0){
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
++i;
continue;
}
}else{
++i;
}
}
}
/*
A:存储值
B:B的索引对应A存储的值
*/
#include
#define N 100
void main(){
int A[N],B[N] = {0};
int i=0,j,len=0,No,temp;
//输入元素并将B置为特定值
while(1){
scanf("%d", &A[i]);
B[A[i]]=1;
len++;
i++;
if(getchar()=='\n') break;
}
//遍历A,并输出对应编号
for(i=0; i<len; i++){
No=1;
printf("%d-",A[i]);
for(j=1; j!=A[i]; ++j){ //A[i]为B中对应的索引
if(B[j]!=0) No++;
}
printf("%d ",No);
}
}
/*
详情:https://blog.csdn.net/l_liangkk/article/details/51980763
*/
#include
#include
#define N 200
void main(){
int i,j,n,m,k;
char s1[N], s2[N]; //字符串作为输入
int a[N] = {0}, b[N] = {0}, c[2*N] = {0}; //用于将字符串输入的数据存储到int数组中
//1:输入数据并实际输入长度
scanf("%s%s",s1,s2);
n=strlen(s1);
m=strlen(s2);
k=n+m; //保证相乘以后的位数不会大于k
//2:将字符串逆序用数字排列存储在数组中
for(i=0; i<n; i++)
a[i]=s1[n-i-1]-'0';
for(j=0; j<m; j++)
b[j]=s2[m-j-1]-'0';
//3:两数相乘
for(i=0; i<n; i++) //模拟乘法
for(j=0; j<m; j++)
c[i+j]+=a[i]*b[j];
for(i=0; i<=k; i++){ //进位
if(c[i]>=10){
c[i+1]+=c[i]/10;
c[i]%=10;
}
}
//4:去除前导0
i=k;
while(c[i]==0) i--;
printf("%d\n",i);
//5:判断两个非负数之
if(i<0) printf("0");
else{
for(; i>=0; i--)
printf("%d",c[i]);
}
}
/*
思想:利用三重循环分别模拟取球过程,每次取球需要与前面的球比较颜色,
颜色相同则抛弃。
*/
void main(){
char *ballcolor[] = {"RED","YELLOW","BLUE","WHITE","BALCK"};
int i,j,k,m=0;
for(i=0; i<5; i++){
for(j=i+1; j<5; j++){
for(k=j+1; k<5; k++){
m++;
printf("%d:%s,%s,%s\n",m,ballcolor[i],ballcolor[j],ballcolor[k]);
}
}
}
}
/*
思想:将N的平方这个数用sprintf函数转为字符串,然后设置头尾指针往中间走
check:判断是否是回文数
*/
bool check(char arr[]){
char *q = arr+strlen(arr)-1; //尾指针
while(arr<q){
if(*arr != *q) return 0;
arr++;
q--;
}
return 1;
}
void main(){
int i;
char str[100];
for(i=1; i<200; i++){
sprintf(str,"%d",i*i); //将i*i转为字符串并放在str字符数组中
if(check(str)) printf("%d-%s\n",i,str);
}
}
/*题目:将str字符串中所包含所有子串substr用新串newstr替换,并返回替换后的字符串。
(假设新子串与旧子串长度一样)
*/
char* replace(char str[], char* substr, char* newstr){
char* p = str; //工作指针
int strLen = strlen(str); //主串长度
int subLen = strlen(substr); //子串长度
while(p<=str+(strLen-subLen)){ //遍历长度
if(strncmp(p,substr,subLen)==0) //如果是要替换的子串
strncpy(p,newstr,subLen);
p++;
}
return str;
}
void main(){
char s[15]="qweabcdefabcgh";
printf("替换前:%s\n",s);
printf("替换后:%s\n",replace(s,"abc","123"));//!使用strcpy、strncpy第1个参数是字符数组或指向字符数组的指针变量
}
/*
题目:将不超过2000以内所有素数从小到大排成一行,第二行上的每个数都等于它右肩膀的数减去它左肩膀的数。编程求出:第二行中是否存在这样的若干连续整数,它们的和恰好是1898?
思想:用一数组存放2000以内的所有素数,再用一数组存放相邻素数的差值,然后对该数组
从第一个到最后一个元素分别计算连续和并判断是否成立。
check:判断是否为质数
*/
bool check(int n){
int i;
for(i=2;i<sqrt(n);i++)
if(n%i==0) return false;
return true;
}
void main(){
int i,j,count=0,sum=0,k=0,A[N],B[N]; //count为素数个数,同时作为遍历索引
//将第一行数据写入到数组A中
for(i=2; i<2000; ++i){
if(check(i)) A[count++]=i;
}
//计算两肩之差写入到数组B中
for(i=1; i<count-1; ++i){ //遍历第二行数据,从第2个开始遍历,到倒数第2个结束
B[i] = A[i+1]-A[i-1];
printf("%d\n",B[i]);
}
//遍历求出连续整数和为1898的情况
for(i=1; i<count-1; ++i){
sum = 0;
j = i;
while(sum<1898){
sum+=B[j];
j++;
}
if(sum=1898) k++;
}
printf("符合要求的个数%d个。",k);
}
字符读写函数fgetc和fputc——利用字符读写函数fgetc()、fputc()实现文件拷贝
void main(){
FILE *input,*output;
//1:先打开文件
if((input=fopen("D://word.txt","r"))==NULL){
printf("打开输入文件失败!");
exit(-1);
}
//2:创建输出文件
if((output=fopen("D://word-cpy.txt","w"))==NULL){
printf("创建输出文件失败!");
exit(-1);
}
//3:将输入文件中的数据输出到输出文件当中去
for(;!feof(input);){ //关键
fputc(fgetc(input),output); //每执行依次fgetc函数,指针input就会向后移动一次,fputc同理。
}
fclose(input);
fclose(output);
}
——————————————————————————————————————
字符读写函数fgetc和fputc——从文件word.txt中写入两行文本,然后三次读出其内容
void main(){
FILE *fp1, *fp2;
char str[]="123456789";
//1:创建文件
if((fp1=fopen("D://word.txt","w"))==NULL){
printf("创建文件失败!");
exit(-1);
}
//2:向文件中写内容,并关闭文件指针
fputs(str, fp1); //将字符串"123456"写入文件
fputs("\nabcd",fp1); //写入第一行文本的换行符和下一行文本
fclose(fp1); //关闭文件
//3:读取文件中的内容,并关闭文件指针
fp2=fopen("D://word.txt","rt"); //以只读方式打开
fgets(str,8,fp2); //读取字符串,最大长度是7,将是"1234567"
printf("%s\n",str);
fgets(str,8,fp2); //读取字符串,最大长度为7,实际上将是"89\n"
printf("%s\n",str);
fgets(str,8,fp2); //读取字符串,最大长度是7,实际上是"abcd"
printf("%s\n",str);
fclose(fp2);
}
字符读写函数fgetc和fputc——利用字符串读写函数fgets()、fputs()实现文件拷贝
void main(){
FILE *input, *output; //input:源文件指针,output:目标文件指针
char str[81];
//1:打开目标文件
if((input=fopen("D://word.txt","r"))==NULL){
printf("打开目标文件失败!");
exit(-1);
}
//2:创建目标文件
if((output=fopen("D://word-cpy.txt","w"))==NULL){
printf("创建目标文件失败!");
exit(-1);
}
//3:复制源文件到目标文件当中
while(fgets(str,81,input)!=NULL){
fputs(str,output);
}
//4:关闭源文件
fclose(input);
fclose(output);
}
——————————————————————————————————————
数据块读写函数fread和fwrite——将一整型数据存放到文件中,然后从文件中读取到数组中
void main(){
FILE* fp;
short i, a[10]={0,1,2,3,4,5,6,7,8,9};
//1:创建文件
fp=fopen("D://word.dat", "wb"); //!创建二进制文件
if(fp==NULL){
printf("创建文件失败!");
exit(-1);
}
//2:向文件内写数据
fwrite(a,sizeof(short),10,fp); //将数组a的10个整型数据写入文件中
fclose(fp);
//3:打开创建的文件
fp=fopen("D://word.dat","rb");
if(fp==NULL){
printf("打开文件失败!");
exit(-1);
}
//4:读取文件中的内容
memset(a,0,10*sizeof(short));
fread(a,sizeof(short),10,fp);
fclose(fp);
for(i=0;i<10;++i){
printf("%d ",a[i]);
}
}
数据块读写函数fread和fwrite——将一整型数据存放到文件中,然后从文件中读取到数组中
void main(){
int i=3;
float f=(float)9.8;
FILE* fp;
//1:创建文件
fp=fopen("D://word.txt","w"); //创建文本文件
if(fp==NULL){
printf("创建文件失败!");
exit(-1);
}
//2:向文件中写内容并关闭文件
fprintf(fp,"%2d,%6.2f",i,f); //将变量i和f的值格式化输出到文件中去,注意:,号也被写入文件中去了
fclose(fp);
//3:打开文件
fp=fopen("D://word.txt","r");
if(fp==NULL){
printf("打开文件失败!");
exit(-1);
}
//4:读取文件中的内容
i=0; //i和j清0
f=0;
fscanf(fp,"%d,%f",&i,&f); //从文件中读取数值到变量i和f
fclose(fp);
//5:显示从文件中读取的变量i和f的值
printf("i=%2d,f=%6.2f\n",i,f);
}
void main(){
char str[]="0123456789";
strlshift(str, 3);
printf("%s\n", str);
}
void strlshift(char *s, int n){
int i, len;
char ch;
len=strlen(s);
for(i=0; i<n; i++){ //每次从第二个元素依次向前移动1次,一共n轮
ch=s[0];
strncpy(s,s+1,len-1); //将第二个字符开始的len-1个字符左移
s[len-1]=ch;
}
}
/*
思想:利用标记
*/
void main(){
int n,i,j=0,flags[3]={0};
scanf("%d", &n);
if(n%3==0) flags[0]=3;
if(n%5==0) flags[1]=5;
if(n%7==0) flags[2]=7;
for(i=0;i<3;i++){
if(flags[i]){
printf("%d可以被%d整除 ",n,flags[i]);
j++;
}
}
if(j==0) printf("%d不能被3、5、7整除\n",n);
}
void main(){
int i,j,k,sum;
sum=0;
for(i=0; j<=36; i++){
k=i; //起始彩票
sum=i;
for(j=1; i<=6; j++){
k=k+j; //第j+1张彩票
if(k>36) break; //彩票好超过36退出循环
sum+=k;
}
if(sum!=105) continue; //和数不够105继续下一轮
//将这几张彩票输出
k=i;
for(j=0; j<=6; j++) printf("%d", k=k+j); //显示彩票号码
printf("\n");
}
}
void main(){
int i,len;
char s[100];
scanf("%s",s);
len = strlen(s);
switch(s[len-1]){
case 'y':
s[len-1] = 'i';
s[len] = 'e';
s[len+1] = 's';
s[len+2] = '\0';
break;
case 'x':
case 's':
case 'o':
s[len] = 'e';
s[len+1] = 's';
s[len+2] = '\0';
break;
case 'h':
if(s[len-1]=='i' || s[len-1]=='s'){
s[len] = 'e';
s[len+1] = 's';
s[len+2] = '\0';
}
break;
default:
s[len] = 's';
s[len+1] = '\0';
break;
}
printf("%s", s);
}
/*
思路:使用sprintf让数字转字符串
*/
int calu(char s[]){
int i=0,temp,result=1;
while(s[i]!='\0'){
temp = s[i]-'0';
if(temp!=0){
result*=temp;
}
i++;
}
return result;
}
void main(){
char str[10];
int i,count=0,value;
for(i=1; i<10000; i++){
sprintf(str,"%s",i); //转为字符串,并放入str中
value = calu(str);
if(value>0 && value<10) count++;
}
printf("个数为%d", count);
}
}
/*
例如:
原文:dAE, BfC
CCbbAA
结果:, ABCdef
AACCbb
思路:用一个二维数组存储每一行元素,每读取一行将其放置数组,然后对该行元素排序,排序后读取下一行。最后将数组中的内容输出到文件中。
*/
void main(){
char strs[100][100],t; //strs存储文件读取的内容
int i=0,j,k,len;
FILE* fp = fopen("D://words.txt", "r");
//1:读取并排序过程
//每读一行,对该行排序并存在数组对应位置,然后再读取下一行
while(!feof(fp)){
printf("dda");
fgets(strs[i],100,fp);
len = strlen(strs[i]);
//冒泡排序
for(j=0;j<len;i++){
for(k=1;k<len-j;k++){
if(strs[j][k-1]>strs[j][k]){
t = strs[j][k-1];
strs[j][k-1] = strs[j][k];
strs[j][k] = t;
}
}
}
//并将字符串尾设置为指定格式,然后i+1
strs[i][len]='\n';
strs[i][len+1]='\0';
i++;
}
fclose(fp);
//2:将排序后字符串写入文件中,并关闭文件
fp = fopen("D://words.txt","w");
for(j=0; j<i; j++)
fputs(strs[j],fp);
fclose(fp);
}
*/
/*
结构体数组输入那有坑
*/
typedef struct Student{
char no[9];
char name[10];
char sex;
int age;
}Student;
void main(){
int i;
Student stus[3],temp[3];
//1:输入五个学生数据
for(i=0; i<3; i++){
scanf("%s%s %c%d",stus[i].no,stus[i].name,&stus[i].sex,&stus[i].age);
}
printf("\n");
//1:打开并写入文件
FILE* fp = fopen("D://student.dat","wb+");
fwrite(stus, sizeof(Student),3,fp);
//3:读取文件中的内容
for(i=0; i<3; i++){
fseek(fp, i*sizeof(Student), SEEK_SET);
fread(&temp[i], sizeof(Student),1,fp);
printf("%s %s %c %d\n",temp[i].no,temp[i].name,temp[i].sex,temp[i].age);
}
fclose(fp);
}
/*
maxLoc:最长单词的起始位置
maxLen:最长单词的长度
wordLoc:当前单词的起始位置
wordLen:当前单词的长度
*/
void main(){
char str[80];
int i, maxLoc, maxLen, wordLoc, wordLen;
//1:键入字符串
get(str);
//2:核心代码
i=0;
maxLoc=0;
maxLen=0;
while(str[i]!='\0'){
//找到单词的起始位置,并初始化wordLoc、wordLen
while(str[i]!=' ') i++;
wordLoc=i;
wordLen=0;
//计算该单词长度
while(str[i]!='\0' && str[i]!=' '){ //两个判断一个都不能少
wordLen++;
i++;
}
//判断当前这个单词长度是否比之前最大的大
if(wordLen>maxLen){
maxLoc=wordLoc;
maxLen=wordLen;
}
}
//3:输出最长单词
for(i=0; i<maxLen; i++)
printf("%c",str[maxLoc+i]);
}
void main(){
int i,j,max,maxIndex,arr[2][3]={1,2,3,4,5,6};
for(i=0; i<2; i++){ //行遍历
max=0;
for(j=0; j<3; j++){ //列遍历
if(arr[i][j]>max)
max=arr[i][j];
maxIndex=j;
}
//再次行遍历,找所在列是否存在比他大的元素
for(j=0; j<2; j++){
if(arr[j][maxIndex]>max) break;
}
//输出鞍点
if(j>=2) printf("Andian is %d\n",arr[i][maxIndex]);
}
}