c语言代码进行除法运算

1，c语言代码进行除法运算时如何控制商不能为0的情况？
2，怎样在进行除法运算时，输出更精确的结果？

4个回答

%

float

If语句控制分母不为0
double控制输出

1，用if选择结构，比如if(n/2!=0)然后继续操作。
2，使用double或float等类型，精度高。

Problem Description Yifenfei and lemon are good friends, they don’t like Ctw, because Ctw’s name is so worldliness. One day Lcy give them a lot of jewel. Each jewel has own value. They put the jewels in a line, and don’t swap the position of jewel. In order to division the jewels, they think a lot of ideas. At last, they decide a way to division by voting. First let Ctw to divide the line into two non-empty sublines (each subline express a group of jewel). Second yifenfei will to divide one of sublines and also divide it into two non-empty sublines. Than let lemon to choose one of this three sublines., than yifenfei choose one of remaining subline. At last Ctw hold the last subline.. Every one wants to maximize their own share. But because yifenfei don’t like Ctw, so if there are two divisions let himself get the some value, he will choose the way let Ctw get smaller values. Assuming every one have full knowledge of each other’s strategies and make their decision optimally. Input The input contains multiple test cases. Each test case include, first one integers n. (3<=n<=100), express how many jewels. Next one line include n integers Vi (Vi<2^31). The order of jewel is according the position in the line.. Output For each test case output one integer that CTW is maximum value of jewels can get. Sample Input 4 50 90 10 100 3 5 5 5 9 1 1 1 1 1 1 1 1 1 Sample Output 50 5 2
c语言除法还有取整运算
C语言，组合数的一个计算，除法
Problem Description In the popular TV series Heroes, there is a tagline "Save the cheerleader, Save the world!". Here Heroes continues, "Solve the puzzle, Save the world!". Finally, alien invaders visit our planet. They are eccentric and launch attack many rounds. Since trust in prime numbers, each round they send out p killers, here p is a prime number. Countries on our planet unite and assemble an armed troop of n population. And fortunately we get a fatal weakness of enemy from a betrayer. If the ways of choosing m warriors from n is a multiple of p, the killer number, we will win. Otherwise, we will lose. As the greatest programmer of our planet, you are invited to write a program to count the number of m(0≤m≤n) such that C(n, m) is a multiple of prime p. Input Each line will contain an integer n(1≤n≤10^5) and a prime p(2≤p<10^7), separated by a single space. Process to the end of file. Output For each test of case, if the world can be saved, output the number of ways, otherwise, output "Where is hero from?"(without quotation), both on a single line. Sample Input 6 2 5333 127 100000 11 Sample Output 3 Where is hero from? 92301
C语言 如何实现用减法代替除法的运算并且有余数的时候显示余数

c语言 计算高精度浮点数 请问两段代码有什么不同？为什么其中一个会提示浮点错误？

C语言项目，怎么都调不出来，求修改，详细说明或者把改好的代码发出来，谢谢！
![图片说明](https://img-ask.csdn.net/upload/201911/24/1574581202_803596.jpg) （为什么打上去是全的，发出去就缺了呢） #include<stdio.h> #include<string.h>//字符串函数 #include<math.h> long Fact(int n); long FactSum(int v); //函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1：加法\n"); printf("2：减法\n"); printf("3：乘法\n"); printf("4：除法\n"); printf("5：求余\n"); printf("6：累加\n"); printf("7：阶乘\n"); printf("8：阶乘累加\n"); printf("9：退出系统\n"); } void password() { int i=0,temp; char password[10]={0}; //声明一个最多有十个元素的数组，并且初始化值为0； for(i=0;i<3;i++) //循环语句体验证密码 { printf("请输入密码："); scanf("%s",password);//输入密码（字符串） if(strcmp("19491001",password)==0)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); while(flag==0) { displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; default:printf("选项输入错误!\n"); } else { printf("your inputs is error!\n");flag=1; } } getch(); //菜单 } else { printf("密码错误\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a+b; } void minus() { double a,b,temp; printf("请输入被减数与减数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); temp=a-b; } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a*b; } void divide() { double a,b,temp; printf("请输入被除数与除数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); if(b!=0) temp=a/b; else printf("错误！\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数：\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; } else printf("错误！\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值：\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为：%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; } return 0; } long Fact(int n)//函数的定义（作用：计算输入阶乘数的阶乘，并将结果返回主函数,且当n<0时，返回-1） { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数,且当n<0时，返回-1） { int i; long result=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; result+=j; } return result; } } void main() { password(); printf("结果是：%lf",temp); }

Problem Description As a recruiting ploy, Google once posted billboards in Harvard Square and in the Silicon Valley area just stating “{first 10-digit prime found in consecutive digits of e}.com”. In other words, find that 10-digit sequence and then connect to the web site— and find out that Google is trying to hire people who can solve a particular kind of problem. Not to be outdone, Gaggle (a loosy-goosy fuzzy logic search firm), has devised its own recruiting problem. Consider the base 7 expansion of a rational number. For example, the first few digits of the base 7 expansion of 1/510 = 0.12541...7,33/410 = 11.15151...7, and 6/4910 = 0.06000...7, From this expansion, find the digits in a particular range of positions to the right of the "decimal" point. Input The input file begins with a line containing a single integer specifying the number of problem sets in the file. Each problem set is specified by four base 10 numbers on a single line, n d b e, where n and d are the numerator and denominator of the rational number and 0 ≤ n ≤ 5,000 and 1 ≤ d ≤ 5,000. b and e are the beginning and ending positions for the desired range of digits, with 0 ≤ b,e ≤ 250 and 0 ≤ (e-b) ≤ 20. Note that 0 is the position immediately to the right of the decimal point. Output Each problem set will be numbered (beginning at one) and will generate a single line: Problem k: n / d, base 7 digits b through e: result where k is replaced by the problem set number, result is your computed result, and the other values are the corresponding input values. Sample Input 4 1 5 0 0 6 49 1 3 33 4 2 7 511 977 122 126 Sample Output Problem set 1: 1 / 5, base 7 digits 0 through 0: 1 Problem set 2: 6 / 49, base 7 digits 1 through 3: 600 Problem set 3: 33 / 4, base 7 digits 2 through 7: 151515 Problem set 4: 511 / 977, base 7 digits 122 through 126: 12425

/* 英文算数计算系统 从键盘输入两个小于100的整数A和B，计算A与B两数的基本算数运算。需要注意的是：A和B的每一位数位上的数字由对应的英文单词给出。 系统要求： （1）系统由菜单做导航，给出输入数据功能、退出程序功能、数据输入功能并能够循环输入执行运算等。 （2）在数据运算输入功能菜单下分别给出A与B的相加运算、A与B的相乘运算、A与B的相减运算、A与B的相除运算、A与B的相除取于运算等功能。 （3）当A输入为zero，同时B输入为zero时自动返回菜单上一级。 输入样例： one + two = three four + five six = zero seven + eight nine = zero + zero = 输出样例： one + two = three three four + five six = nine zero zero seven + eight nine = nine six */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 30 //定义最大30个测试用例 char a[N][50]; //定义每个测试用例可以有50个字符 char comp[10][6] = {"zero","one","two","three","four","five","six","seven","eight","nine"}; int val[N]; void StringBracket(char *str)//删除空格 { int i,j,len; len=strlen(str); j=0; for(i=0; i<len; i++) { if(str[i]!=' ') { str[j]=str[i]; j=j+1; } } str[j]='\0'; } char calval(char *str) //计算每个表达式的值 { int i,j,len,y; int a1=0,a2=-1,b1=0,b2=-1;//每个表达式最多有4个整数 char str1[20],str2[20];//分解为两个字符串 char stra1[10],stra2[10]={0},strb1[10],strb2[10]={0};//每个字符串最多分解为两个子串 len=strlen(str); for(i=0; i<len; i++) { str1[i]=str[i]; if(str[i]=='+'|| str[i]=='-'|| str[i]=='*'|| str[i]=='/'|| str[i]=='%') { str1[i]='\0'; for(j=i+1; j<len; j++) str2[j-i-1]=str[j]; str2[len-i-2]='\0'; break; } } len=strlen(str1); for(i=0; i<len; i++) { stra1[i]=str1[i]; if(i>1 && str1[i]==' ') { stra1[i]='\0'; for(j=i+1; j<len; j++) stra2[j-i-1]=str1[j]; stra2[len-i-1]='\0'; break; } } len=strlen(str2); for(i=0; i<len; i++) { strb1[i]=str2[i]; if(i>1 && str2[i]==' ') //i>1表示不考虑前面的空格 { strb1[i]='\0'; for(j=i+1; j<len; j++) strb2[j-i-1]=str2[j]; strb2[len-i-1]='\0'; break; } } StringBracket(stra1); StringBracket(stra2); StringBracket(strb1); StringBracket(strb2); for(i=0; i<10; i++) { if(strcmp(stra1,comp[i])==0) a1=i; if(strcmp(stra2,comp[i])==0) a2=i; if(strcmp(strb1,comp[i])==0) b1=i; if(strcmp(strb2,comp[i])==0) b2=i; } if(a2>=0) a1=a1*10+a2; //a2初始化为-1，>=0表示为两位数 if(b2>=0) b1=b1*10+b2; switch(y) { case 1: return a1+b1; break; case 2: return a1-b1; break; case 3: return a1*b1; break; case 4: return a1/b1; break; case 0: return a1%b1; break; default: printf(" 输入错误,请重新输入\n"); } } int main() { int i,j,n=0; int y; char str[10]; printf("|--------------------------------|\n"); printf("| 英文算数计算系统 |\n"); printf("| 1--加法运算 |\n"); printf("| 2--减法运算 |\n"); printf("| 3--乘法运算 |\n"); printf("| 4--除法运算 |\n"); printf("| 0--相除取余运算 |\n"); printf("|--------------------------------|\n\n"); printf("|你想要进行哪一种运算（0-4） |\n"); scanf("%d",&y); system("pause"); system("cls"); printf("Please input numbers:\n"); while(1) { gets(a[n]); val[n]=calval(a[n]); if(val[n]==0) break; n++; if(n>=N) break; } printf("Output:\n"); for(i=0;i<n;i++) { if (val[i]>0) { itoa(val[i], str, 10);//整数转换为字符串 printf("%s ",a[i]);//输出原表达式 for(j=0;j<strlen(str);j++) { printf("%s ",comp[str[j]-0x30]); } } printf("\n"); } return 0; }
c语言简易计算器小白问题
#include <stdio.h> float fun1(float a,float b) { float c; c=a+b; return c; } float fun2(float a,float b) { float c; c=a-b; return c; } float fun3(float a,float b) { float c; c=a*b; return c; } float fun4(float a,float b) { float c; c=a/b; return c; } int main() { int d; float a,b; printf("\t\t|--------------------|\n"); printf("\t\t| 简易计算器 |\n"); printf("\t\t|--------------------|\n"); printf("\t\t| 1-加法 |\n"); printf("\t\t| 2-减法 |\n"); printf("\t\t| 3-乘法 |\n"); printf("\t\t| 4-除法 |\n"); printf("\t\t| 0-退出 |\n"); printf("\t\t|--------------------|\n"); printf("选择需要的计算:\n"); scanf("%d",&d); while(d<=5&&d>0) { printf("输入两个数字:\n"); scanf("%f,%f"&a,&b); switch(d) { case 1: printf("%.2f",fun1(a,b)); break; case 2: printf("%.2f",fun2(a,b)); break; case 3: printf("%.2f",fun3(a,b)); break; case 4: printf("%.2f",fun4(a,b)); break; case 0: printf("谢谢使用~~"); break; } } printf("\n谢谢使用~~"); return 0; } 显示输入那个位置有问题。新手求指导。我自己感觉结构有问题
C语言项目，功能8，9不能正常实现，求修改，按如图要求
![图片说明](https://img-ask.csdn.net/upload/201911/25/1574686303_298098.png) #include "stdio.h" #include "string.h"//字符串函数 #include "stdlib.h" #include"stdbool.h" long Fact(int n); long FactSum(int v); //函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1：加法\n"); printf("2：减法\n"); printf("3：乘法\n"); printf("4：除法\n"); printf("5：求余\n"); printf("6：累加\n"); printf("7：阶乘\n"); printf("8：阶乘累加\n"); printf("9：退出系统\n"); } void password() { int i=0,temp; bool login_status=false; char password[10]={0}; //声明一个最多有十个元素的数组，并且初始化值为0； //for(i=0;i { for(i=0;i<3;i++) { printf("请输入密码："); scanf("%s",password);//输入密码（字符串） if(strcmp("19491001",password)==0) { login_status=true; break; }else printf("密码错误，重新输入"); } if(true==login_status)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); while(flag==0) { putchar('\n'); displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; default:printf("选项输入错误!\n"); } else { printf("your inputs is error!\n");flag=1; } } getch(); //菜单 } else { printf("密码错误超过三次\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a+b; printf("结果是：%lf",temp); } void minus() { double a,b,temp; printf("请输入被减数与减数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); temp=a-b; printf("结果是：%f",temp); } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a*b; printf("结果是：%f",temp); } void divide() { double a,b,temp; printf("请输入被除数与除数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); if(b!=0) { temp=a/b; printf("结果是：%f",temp); } else printf("错误！\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数：\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; printf("结果是：%d",temp); } else printf("错误！\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值：\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为：%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; printf("结果是：%d",temp); } return 0; } long Fact(int n)//函数的定义（作用：计算输入阶乘数的阶乘，并将结果返回主函数,且当n<0时，返回-1） { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数,且当n<0时，返回-1） { int i; long result=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; result+=j; } return result; } } void main() { int temp; password(); printf("运行结束"); }
c语言中函数中变量范围的问题？
ATT 测试环境：vs2013 win7 直接上代码 ``` # include <stdio.h> # include <stdlib.h> void switch_a () //声明switch_a函数 void menu()//声明menu函数 int main() { int a, b; //参加运算的两个数字 int c; //判断进行什么运算的变量 printf("欢迎使用四则运算器\n"); printf("请输入两个整型数字以空格隔开\n"); scanf_s("%d %d", &a, &b); //输入 两个整数 分别到a，b变量中 menu(); //调用menu函数 scanf_s("%d", &c);//输入1，2，3，4其中一个数字到变量c中 switch_a ();//调用switch_a函数 system("pause"); return 0; } void menu() { printf("+ 选择 1\n"); //输出菜单上的选择内容 printf("- 选择 2\n"); printf("x 选择 3\n"); printf("/ 选择 4\n"); return 0; } void switch_a () { switch (c) //判断C的值 { case 1: //c == 1 就是加法运算 printf("%d+%d=%d\n", a, b, a + b); break; case 2: //c == 2 就是减法运算 printf("%d-%d=%d\n", a, b, a - b); case 3: // c == 3 就是乘法运算 printf("%dX%d=%d\n", a, b, a*b); case 4: //c == 4 就是除法运算 printf("%d/%d=%d\n", a, b, a / b); default: //c == other 输出以下信息 printf("本程序只能输入1，2，3，4 您输入的数字应该不是它们之间的，请仔细检查！\n"); break; } return 0; } ``` 问题： 为什么switch_a函数里的a，b，c 还可以用？a，b，c的声明都是在main函数里面进行的

#include "stdio.h" #include "string.h"//字符串函数 #include "stdlib.h" long Fact(int n); long FactSum(int v); //函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数 void displaymain()//显示主菜单 { printf("*******************\n"); printf("简易计算器\n"); printf("*******************\n"); printf("请选择\n"); printf("1：加法\n"); printf("2：减法\n"); printf("3：乘法\n"); printf("4：除法\n"); printf("5：求余\n"); printf("6：累加\n"); printf("7：阶乘\n"); printf("8：阶乘累加\n"); printf("9：退出系统\n"); } void password() { int i=0,temp; char password[10]={0}; //声明一个最多有十个元素的数组，并且初始化值为0； printf("请输入密码："); scanf("%s",password);//输入密码（字符串） if(strcmp("19491001",password)==0)//strcmp:比较两个字符串是否一样 { printf("登陆成功\n"); int choice,flag=0; void displaymain(); void plus(); void minus(); void multiply(); void divide(); void complementation(); void accumulation(); int factorial(); int factorialSum(); void tuichu(); while(flag==0) { putchar('\n'); displaymain(); printf("please input a digital(1-7)\n"); scanf("%d",&choice); if(choice>=1&&choice<=7) switch(choice) { case 1:plus();break; case 2:minus();break; case 3:multiply();break; case 4:divide();break; case 5:complementation();break; case 6:accumulation();break; case 7:factorial();break; case 8:factorialSum();break; case 9:tuichu();break; default:printf("选项输入错误!\n"); } } getch(); //菜单 } else { printf("密码错误\n"); } } void plus() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a+b; printf("结果是：%lf",temp); } void minus() { double a,b,temp; printf("请输入被减数与减数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); temp=a-b; printf("结果是：%f",temp); } void multiply() { double a,b,temp; printf("请输入以空格分隔的两个运算数：\n"); scanf("%lf %lf",&a,&b); temp=a*b; printf("结果是：%f",temp); } void divide() { double a,b,temp; printf("请输入被除数与除数（并用空格隔开）：\n"); scanf("%lf %lf",&a,&b); if(b!=0) { temp=a/b; printf("结果是：%f",temp); } else printf("错误！\n"); } void complementation() { int a,b,temp; printf("请输入两个用空格隔开的运算数：\n"); scanf("%d %d",&a,&b); if(b!=0) { temp=a%b; printf("结果是：%d",temp); } else printf("错误！\n"); } void accumulation() { int n,temp; int a,sum=1; printf("请输入要求累加的数值：\n"); scanf("%d",&n); for(a=2;a<=n;a++) { sum+=a; } temp=sum; printf("累加和为：%d\n",temp); } int factorial() { int m; long ret,temp; printf("请输入想求的阶乘数:"); scanf("%d",&m); ret = Fact(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else { temp=ret; printf("结果是：%d",temp); } return 0; } long Fact(int n)//函数的定义（作用：计算输入阶乘数的阶乘，并将结果返回主函数,且当n<0时，返回-1） { int i; long result = 1; if(n<0) { return -1; } else { for(i = 2;i<=n;i++) { result*=i; } return result; } } int factorialSum() { int m; long ret,temp; printf("请输入想求的阶乘和数:"); scanf("%d",&m); ret = FactSum(m);//调用函数Fact(),并将函数的返回值存入ret if(ret==-1) printf("输入错误!\n"); else temp=ret; return 0; } long FactSum(int v)//函数的定义（作用：计算输入阶乘数的阶乘和，并将结果返回主函数,且当n<0时，返回-1） { int i; long W=1,j = 1; if(v<0) { return -1; } else { for(i = 2;i<=v;i++) { j*=i; W+=j; } return W; } } void tuichu() { printf("已退出"); } void main() { int temp; password(); printf("结果是：%lf",temp); } ![图片说明](https://img-ask.csdn.net/upload/201911/25/1574687755_948559.png)

CRC校验代码看不懂，请求高手支招。目前我看不懂的一篇CRC校验文章和一套逆序CRC校验。
#各位大神，我看不懂这篇文章还有一段逆序CRC代码。请各位大神帮帮忙： ## 1、文章（链接地址：https://wenku.baidu.com/view/9f7b55876f1aff00bed51ec0.html） 下面为不完全版 CRC(Cyclic Redundancy Check)校验应用较为广泛，以前为了处理简单，在程序中大多数采用LRC(Longitudinal Redundancy Check)校验，LRC校验很好理解，编程实现简单。用了一天时间研究了CRC的C语言实现，理解和掌握了基本原理和C语言编程。结合自己的理解简单写下来。 1、CRC简介 CRC检验的基本思想是利用线性编码理论，在发送端根据要传送的k位二进制码序列，以一定的规则产生一个检验码r位(就是CRC码)，附在信息后面，构成一个新的二进制码序列数共(k+r)位，最后发送出去。接收端根据同样的规则校验，以确定传送中是否出错。接收端有两种处理方式：1、计算k位序列的CRC码，与接收到的CRC比较，一致则接收正确。2、计算整个k+r位的CRC码，若为0，则接收正确。 CRC码有多种检验位数，8位、16位、32位等，原理相同。16位的CRC码产生的规则是先将要发送的二进制序列数左移16位（即乘以2的16次方后），除以一个多项式，最后所得到的余数就是CRC码。 求CRC码所采用的是模2运算法则，即多项式除法中采用不带借位的减法运算，运算等同于异或运算。这一点要仔细理解，是编程的基础。 CRC-16: (美国二进制同步系统中采用) G(X) = X16 + X15 + X2 + 1 CRC-CCITT: (由欧洲CCITT推荐) G(X) = X16 + X12 + X5 + 1 CRC-32: G(X) = X32 + X26 + X23 + X22 + X16 +X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1 2、按位计算CRC 采用CRC-CCITT多项式，多项式为0x11021，C语言编程时，参与计算为0x1021，这个地方得深入思考才能体会其中的奥妙，分享一下我的思路：当按位计算CRC时，例如计算二进制序列为1001 1010 1010 1111时，将二进制序列数左移16位，即为1001 1010 1010 1111 (0000 0000 0000 0000)，实际上该二进制序列可拆分为1000 0000 0000 0000 (0000 0000 0000 0000) + 000 0000 0000 0000 (0000 0000 0000 0000) + 00 0000 0000 0000 (0000 0000 0000 0000) + 1 0000 0000 0000 (0000 0000 0000 0000) + …… 现在开始分析运算： <1>对第一个二进制分序列求余数，竖式除法即为0x10000 ^ 0x11021运算，后面的0位保留； <2>接着对第二个二进制分序列求余数，将第一步运算的余数*2后再和第二个二进制分序列一起对0x11021求余，这一步理解应该没什么问题。如果该分序列为0，无需计算。 <3>对其余的二进制序列求余与上面两步相同。 <4>计算到最后一位时即为整个二进制序列的余数，即为CRC校验码。 该计算方法相当于对每一位计算，运算过程很容易理解，所占内存少，缺点是一位一位计算比较耗时。 下面给出C语言实现方法： 复制代码 代码如下: ## 第一段代码 unsigned char test[16] = {0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff}; unsigned char len = 16; void main( void ) { unsigned long temp = 0; unsigned int crc; unsigned char i; unsigned char *ptr = test; while( len-- ) { for(i = 0x80; i != 0; i = i >> 1) { temp = temp * 2; if((temp & 0x10000) != 0) temp = temp ^ 0x11021; if((*ptr & i) != 0) temp = temp ^ (0x10000 ^ 0x11021); } ptr++; } crc = temp; printf("0x%x ",crc); } 上面的程序根据运算分析而来，很容易理解。为了节约内存空间，我们对程序作进一步的简化。分析可知，当二进制序列中上一位计算的余数第15bit位为1时，即( 上一位计算的余数 & 0x8000) != 0，计算本位时，上一位余数 * 2后可对0x11021作求余运算,然后再加上本位计算所得余数。这个很好理解，也就是说，打个比方，把它看作简单的除法，计算上一位时的余数乘以2后，如果比较大可以当被除数，就再去除除数求余。有一点和普通除法不同的是，因为多项式除法中采用不带借位的减法运算，所以0x10000也可以被0x11021除，余数并非为0x10000,而是0x1021。这个自己动手算一下就知道了。余数之和也是不带进位的加法运算，即异或。最后还强调一点，因为二进制序列是左移16位后参与运算的，所以，一直算到序列的最后一位也是可以被除的，这点大家要明白。下面给出简化后的C语言实现。 复制代码 代码如下: ## 第二段代码 unsigned char test[16] ={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa,0xbb,0xcc,0xdd,0xee,0xff}; unsigned char len = 16; void main( void ) { unsigned int crc = 0; unsigned char i; unsigned char *ptr = test; while( len-- ) { for(i = 0x80; i != 0; i = i >> 1) { if((crc & 0x8000) != 0) { crc = crc << 1; crc = crc ^ 0x1021; } else { crc = crc << 1; } if((*ptr & i) != 0) { crc = crc ^ 0x1021; } } ptr++; } printf("0x%x ",crc); } 上面这段程序网上较为常见，但冇得详细的解释。通过我上面的详细分析，如果对此段程序理解还有困难，可以对比一下没简化之前的程序，细细品味一哈，还是比较容易理解的。要是还理解不了，还是从头再看下，我码这么多字容易吗。。。。。 按位计算CRC代码比较简单，所占内存少，但要一位一位去计算，下面再介绍一种按字节查表快速计算CRC的方法。 3、按字节计算CRC 有了上面按位计算的知识，理解这个就是小case了。还是举前面的例子：当字节计算CRC时，例如计算二进制序列为1001 1010 1010 1111时，即0x9a9f时，将二进制序列数左移16位，即为0x9a9f(0 0 0 0)，实际上该二进制序列可拆分为0x9a00(0 0 0 0) + 0x009f(0 0 0 0)，分析计算时和上面的步骤一样，唯一不同的是计算中上一步的余数CRC要乘以2的八次方参与下一步的运算，这个应该好理解撒。为了简化编程，将计算中的CRC拆成高八位和低八位的形式，高八位的值直接与本位值相加求余，低八位的值乘以2的八次方后作为余数和计算得的余数相加。为了提高计算速度，我们把8位二进制序列数的CRC全部计算出来，放在一个表中，采用查表法可大大提高计算速度。 表是怎么得到的呢？当然是计算出来的，下面的程序给出了多项式是0x11021的计算程序。 复制代码 代码如下: ## 第三段代码 void main( void ) { unsigned int crc = 0; unsigned char i; unsigned int j; for(j = 0; j < 256; j++) { crc = 0; for(i = 0x80; i != 0; i = i >> 1) { if((crc & 0x8000) != 0) { crc = crc << 1; crc = crc ^ 0x1021; } else { crc = crc << 1; } if((j & i) != 0) { crc = crc ^ 0x1021; } } printf("0x"); if(crc < 0x10) { printf("000"); } else if(crc < 0x100) { printf("00"); } else if(crc < 0x1000) { printf("0"); } printf("%x, ",crc); } } 如果你不是使用的0x11021多项式，只需把程序中0x1021换成其他的就可以了。后面的几个printf语句为了控制使生成的表比较整齐，如果无所谓，可直接用printf("0x%x, ",crc)；代替。生成的表如下： 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, 0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6, 0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de, 0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485, 0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d, 0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4, 0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc, 0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823, 0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b, 0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12, 0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a, 0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41, 0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49, 0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70, 0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78, 0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f, 0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067, 0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e, 0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256, 0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d, 0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405, 0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c, 0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634, 0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab, 0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3, 0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a, 0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92, 0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9, 0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1, 0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8, 0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0, 好了，我们来写按字节计算的源程序： ## 第六段代码（CRC逆序校验代码） uint8 xCal_crc(uint8 *ptr,uint32 len) { uint8 crc; uint8 i; uint32 lenBak = len; uint8 *ptrBak = ptr; uint32 Debuglen = lenBak; uint8 *Debugptr = ptrBak; char CrcSendBuf[100] = {0}; crc = 0; while(len--) { crc ^= *ptr++; memset(CrcSendBuf, 0, 100); sprintf(CrcSendBuf, "head->crc = %02x \r\n", crc); UartSendString(CrcSendBuf, strlen(CrcSendBuf)); for(i = 0;i < 8;i++) { if(crc & 0x01) { crc = (crc >> 1) ^ 0x8C; } else { crc >>= 1; } } } return crc; }

CCF 2019.3 二十四点 自己写了一个代码手打各种样例都没问题可是只有30分
![图片说明](https://img-ask.csdn.net/upload/201909/05/1567669319_544641.png) ``` #include<iostream> #include<stdio.h> using namespace std; int main(){ int n; cin>>n; int **a=new int*[n]; for(int i=0;i<n;i++){ a[i]=new int[4]; } char **b=new char*[n]; for(int i=0;i<n;i++){ b[i]=new char[4]; } for(int i=0;i<n;i++){ // cin>>a[i][0]; // b[i][0]=getchar(); // cin>>a[i][1]; // b[i][1]=getchar(); // cin>>a[i][2]; // b[i][2]=getchar(); // cin>>a[i][3]; scanf("%d%c%d%c%d%c%d",&a[i][0],&b[i][0],&a[i][1],&b[i][1],&a[i][2],&b[i][2],&a[i][3]); } for(int i=0;i<n;i++){ int num1=4;//数字剩余的个数 int num2=3;//字符个数 while(num1!=1){ for(int j=0;j<num2;j++){ if(b[i][j]=='x')a[i][j]=a[i][j]*a[i][j+1]; else if(b[i][j]=='/')a[i][j]=a[i][j]/a[i][j+1]; else if(j==num2-1&&b[i][j]=='+')a[i][j]=a[i][j]+a[i][j+1]; else if(j==num2-1&&b[i][j]=='-')a[i][j]=a[i][j]-a[i][j+1]; else continue; //符号和数字相对应，运算一次后，数字和符号都减少，保持靠左对齐，下面的操作是向左移位，保持紧凑 for(int k=j+1;k<num1-1;k++){ a[i][k]=a[i][k+1]; } num1--; for(int k=j;k<num2-1;k++){ b[i][k]=b[i][k+1]; } num2--; break; } } if(a[i][0]==24&&i!=n-1){ cout<<"Yes"<<endl; } else if(a[i][0]==24&&i==n-1){ cout<<"Yes"; } else if(a[i][0]!=24&&i!=n-1){ cout<<"No"<<endl; } else cout<<"No"; } return 0; } ``` 我本人的思路不是网上常用的堆栈的方法，利用的是两个普通数组进行的，一个存数字，一个存符号 先把除法和乘法扫描出来运算，转化成加法减法，每一次运算后保持进行移位靠左对齐保证数字和运算符对应， 希望有能力的大佬帮忙解答一下
PAT乙级1034，codeblocks上运行正确，但提交答案错误

Java学习的正确打开方式

linux系列之常用运维命令整理笔录

Vue + Spring Boot 项目实战（十四）：用户认证方案与完善的访问拦截

Python十大装B语法
Python 是一种代表简单思想的语言，其语法相对简单，很容易上手。不过，如果就此小视 Python 语法的精妙和深邃，那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点，并附上详细的实例代码。如能在实战中融会贯通、灵活使用，必将使代码更为精炼、高效，同时也会极大提升代码B格，使之看上去更老练，读起来更优雅。 1. for - else 什么？不是 if 和 else 才

2019年11月中国大陆编程语言排行榜
2019年11月2日，我统计了某招聘网站，获得有效程序员招聘数据9万条。针对招聘信息，提取编程语言关键字，并统计如下： 编程语言比例 rank pl_ percentage 1 java 33.62% 2 c/c++ 16.42% 3 c_sharp 12.82% 4 javascript 12.31% 5 python 7.93% 6 go 7.25% 7

SQL-小白最佳入门sql查询一

“狗屁不通文章生成器”登顶GitHub热榜，分分钟写出万字形式主义大作

IT界知名的程序员曾说：对于那些月薪三万以下，自称IT工程师的码农们，其实我们从来没有把他们归为我们IT工程师的队伍。他们虽然总是以IT工程师自居，但只是他们一厢情愿罢了。 此话一出，不知激起了多少(码农)程序员的愤怒，却又无可奈何，于是码农问程序员。 码农：你知道get和post请求到底有什么区别？ 程序员：你看这篇就知道了。 码农：你月薪三万了？ 程序员：嗯。 码农：你是怎么做到的? 程序员：
《程序人生》系列-这个程序员只用了20行代码就拿了冠军

11月8日，由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办，科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。 　　区块链技术被认为是继蒸汽机、电力、互联网之后，下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力，电力解决了人类基本的生活需求，互联网彻底改变了信息传递的方式，区块链作为构造信任的技术有重要的价值。 　　1

【技巧总结】位运算装逼指南

《C++ Primer》学习笔记（六）：C++模块设计——函数

8年经验面试官详解 Java 面试秘诀
作者 | 胡书敏 责编 | 刘静 出品 | CSDN（ID：CSDNnews） 本人目前在一家知名外企担任架构师，而且最近八年来，在多家外企和互联网公司担任Java技术面试官，前后累计面试了有两三百位候选人。在本文里，就将结合本人的面试经验，针对Java初学者、Java初级开发和Java开发，给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实

1.两种思维方式在求职面试中，经常会考察这种问题：北京有多少量特斯拉汽车？ 某胡同口的煎饼摊一年能卖出多少个煎饼？ 深圳有多少个产品经理？ 一辆公交车里能装下多少个乒乓球？ 一
so easy！ 10行代码写个"狗屁不通"文章生成器