c-方法总结版
哦吼,记住了就无敌了
1.运算符顺序
C语言的运算符包括单目运算符、双目运算符、三目运算符,优先级如下:
2.用数组代替栈
1.栈为空时入栈,栈不空判断
#include <stdio.h>
#include <string.h>
int main(){
int s[100];//栈
int top=-1;//栈的标志
char str[100];
scanf("%s", str);
int len = strlen(str);
//栈处理
int i;
for(i=0;i<len;i++){
if(top==-1){
top++;
s[top]=str[i];
}else{
if(str[i]==')'){
if(s[top]=='(')
top--;
}else
return 0;
}
}
if(top==-1){
return 1;
}
return 0;
}
3.排序(冒泡排序)
从小到大排序
int i,j,min,temp;
for(i=0;i<n-1;i++){
min=i;
for(j=i+1;j<n;j++){
if(a[min]>a[j])
min=j;
}
temp=a[i];
a[i]=a[min];
a[min]=temp;
}
4.读取文件
使用 p[i]
char p[100];
FILE *fp=fopen("number.txt","r");
if(!fp){
printf("can't open file\n");
return -1;
}
while(!feof(fp)){
fscanf(fp,"%s",p);
}
fclose(fp);
5.质数
返回值为0 表示是质数
返回值为1 表示不是质数
int isPrime(int n){
int i,flag=1;
if(n==1)
return 1;
for(i=2;i<=n-1;i++){
if(n%i==0){
flag=0;
break;
}
}
if(flag==1)
return 0;//是质数
else
return 1;//不是质数
}
->一个正偶数可以分解成两个素数之和
正偶数为i
for(n=2;n<i;n++){//将偶数i分解为两个整数
if(isPrime(n)==0&&isPrime(i-n)==0){
printf("%d=%d+%d\n",i,n,i-n);
}
}
6.递归
实现n的阶乘
int Fac(int n){
if(n==0||n==1){
return 1;
}else
return n*Fac(n-1);
}
7.链表法
struct ListNode{
int val;
struct ListNode *next;
};
//链1
p1=(struct ListNode *)malloc(sizeof(struct ListNode ));
p1->val=n[0];
p1->next=NULL;
q=p1;
for(i=1;i<3;i++){
p=(struct ListNode *)malloc(sizeof(struct ListNode ));
p->val=n[i];//当前的值
q->next=p;
p->next=NULL;
q=p;
}
//输出链表数列
for(i=0;i<len;i++){
printf("%d",p->val);
p=p->next;
}
8.对字母串排序
结果>0就是前面的值大,结果<0就是后面的值大。
strcmp(ar2[min],ar2[j])>0
9.switch case语句
switch (a/10) {
case 9:
return "优";
case 8:
return "良";
}
10.结构体嵌套
//结构体嵌套
struct point{
int year;
int month;
int day;
};
struct stu{
char name[1000];
char sex;
struct point y;
};
int main(){
struct stu a;
fgets(a.name,1000,stdin);
scanf("%c",&a.sex);
scanf("%d%d%d",&a.y.year,&a.y.month,&a.y.day);
printf("%s",a.name);
printf("%c\n",a.sex);
printf("%d %d %d\n",a.y.year,a.y.month,a.y.day);
}
11.闰年判定
闰年判定:可以被4整除,但不可以被100整除或者可以被400整除
for(i=2000;i<=2000+x;i++){
if(i%4==0&&i%100!=0||i%400==0){
printf("%d\n",i);
}
}
12.约瑟夫问题
#include<stdio.h>
#include <string.h>
int main(){
int n,i,j;
scanf("%d",&n);
int num[n+1];
for(i=1;i<=n;i++){
num[i]=1;//1表示人活着
}
j=1;
i=1;
int n1=n;//当前还活着的人数
while(n1>1){
if(num[i]==1){//这个人活着
if(j==3){
num[i]=0;
n1=n1-1;
j=1;
}else
j++;
}
i=i+1;
if(i%n!=0)
i=i%n;
}
for(i=1;i<=n;i++){
if(num[i]==1)
printf("%d",i);
}
}
13.三点定顺逆
/*
设 p1=(x1,y1), p2=(x2,y2), p3=(x3,y3)
求向量
p12=(x2-x1,y2-y1)
p23=(x3-x2,y3-y2)
则当 p12 与 p23 的叉乘(向量积)
*/
int x1,y1,x2,y2,x3,y3,result=0;
scanf("%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3);
result= (x2-x1)*(y3-y2)-(y2-y1)*(x3-x2) ;
if(result>0)
printf("Counterclockwise\n");
else if(result<0)
printf("Clockwise\n");