求m到n之和
int sum(int m,int n){
int sum=0;
for(m;m<=n;m++){
sum+=m;
}
return sum;
}
找两个数中最大者
int max(int x,int y){
if(x>y)
return x;
else
return y;
}
字符金字塔
void CharPyramid( int n, char ch){
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++)
printf(" ");
for(int z=1;z<=i;z++)
printf("%c ",ch);
printf("\n");
}return;
}
符号函数
int sign( int x ){
if(x>0)
return 1;
if(x==0)
return 0;
if(x<0)
return -1;
}
使用函数求奇数和
int even(int n){
if(n%2==1||n%2==-1)
return 0;
else
return 1;
}
int OddSum(int List[],int N){
int i,sum=0;
for(i=0;i<N;i++){
if(even(List[i])==0)
sum+=List[i];
}
return sum;}
使用函数计算两点间的距离
double dist( double x1, double y1, double x2, double y2 ){
double s;
s=(y2-y1)*(y2-y1)+(x2-x1)*(x2-x1);
return sqrt(s);
}
使用函数求素数和
int prime(int p){
int i;
if(p<=1){
return 0;}
else if(p==2){
return 1;}
else{
for(i=2;i<p;i++){
if(p%i==0){
return 0;}
}
return 1;}
}
int PrimeSum(int m,int n){
int sum=0;
for(int i=m;i<=n;i++){
if(prime(i)==1)
sum+=i;
}return sum;
}
使用函数统计指定数字的个数
int CountDigit( int number, int digit ){
int c=0;
if(number<0)number=-number;
if(number==0){
if(number==digit)
c++;
}
while(number!=0){
int a;
a=number%10;
if(a==digit)c++;
number/=10;
}return c;
}
使用函数输出水仙花数
#include<math.h>
int narcissistic( int number ){
int sum=0;
int x=number;
int n=0;
do{
x/=10;
n++;
}while(x!=0);
x=number;
do{
int a;
a=x%10;
sum+=pow(a,n);
x/=10;
}while(x!=0);
if(sum==number)return 1;
else return 0;
}
void PrintN( int m, int n ){
for(int i=m+1;i<n;i++){
if(narcissistic(i)==1)
printf("%d\n",i);
}
}
使用函数求余弦函数的近似值
double funcos( double e, double x ){
double a,s,i,j,b=1.0;
int f=1;
a=1;
s=0;
i=2;
while(fabs(a)>=e){
b=1;
s=s+a;
for(j=1.0;j<=i;j++){
b=b*j;
}
a=pow(x,i)/b;
f=-f;
a=f*a;
i+=2;
}
s+=a;
return s;
}
空心的数字金字塔
void hollowPyramid( int n ){
for(int i=1;i<=n;i++){
for(int j=1;j<=n-i;j++){
printf(" ");
}
printf("%d",i);
if(i==1)printf("\n");
if(i>1&&i<n){
for(int k=1;k<=i*2-3;k++){
printf(" ");
}printf("%d",i);
printf("\n");
}
if(i==n)for(int x=1;x<=i*2-2;x++){
printf("%d",i);
}
}
}
分类统计字符个数
void StringCount( char s[] ){
int i;int l,b,d,o;
l=b=d=o=0;
for(i=0;s[i]!='\0';i++){
scanf("%c",&s[i]);
if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')l++;
else if(s[i]==' '||s[i]=='\n')b++;
else if(s[i]>='0'&&s[i]<='9')d++;
else o++;
}
printf("letter = %d, blank = %d, digit = %d, other = %d",l,b,d,o);
}
使用函数求特殊a串数列和
int fn( int a, int n ){
int sum=a;
for(int i=1;i<n;i++){
sum=sum*10+a;
}
return sum;
}
int SumA( int a, int n ){
int sum=0;
for(int i=1;i<=n;i++){
sum+=fn(a,i);
}return sum;
}
使用函数输出指定范围内的完数
int factorsum( int number ){
int sum=0;
for(int i=1;i<=number/2;i++){
if(number%i==0){
sum+=i;
}
}
return sum;
}
void PrintPN( int m, int n ){
int z=0;
for(int i=m;i<=n;i++){
if(factorsum(i)==i){
printf("%d = 1",i);
for(int j=2;j<=i/2;j++)
{
if(i%j==0)
printf(" + %d",j);
}
printf("\n");
z++;}
}if(z==0)printf("No perfect number");
}
使用函数输出指定范围内的Fibonacci数
int fib( int n ){
if(n<=2)return 1;
int a=1,b=1,c;
if(n>2){for(int i=3;i<=n;i++){
c=a+b;
a=b;
b=c;
}
return b;}
}
void PrintFN( int m, int n ){
int a;int c=0;
for(int i=1;i<25;i++){
a=fib(i);
if(a>=m&&a<=n){
if(c>0)printf(" ");
printf("%d",a);
c++;
}
}if(c==0)printf("No Fibonacci number");
}
使用函数验证哥德巴赫猜想
int prime( int p ){
if(p==1)return 0;
if(p==2)return 1;
if(p>2){
for(int i=2;i<=p/2;i++){
if(p%i==0)return 0;
}return 1;
}
}
void Goldbach( int n ){
for(int i=2;i<=n/2;i++){
if(prime(i)==1&&prime(n-i)==1){
printf("%d=%d+%d",n,i,n-i);
break;
}
}
}
使用函数输出一个整数的逆序数
int reverse( int number ){
int sum=0;
while(number){
int a;
a=number%10;
sum=sum*10+a;
number/=10;
}
return sum;
}
计算两数的和与差
void sum_diff( float op1, float op2, float *psum, float *pdiff ){
*psum=op1+op2;
*pdiff=op1-op2;
}
数组循环右移
void ArrayShift( int a[], int n, int m ){
for(int i=0;i<m;i++){
int left=a[n-1];
for(int j=n-1;j>0;j--){
a[j]=a[j-1];
}
a[0]=left;
}
}
移动字母
void Shift( char s[] ){
int n=strlen(s);
for(int i=0;i<3;i++){
int a=s[0];
for(int j=0;j<n-1;j++){
s[j]=s[j+1];
}
s[n-1]=a;
}
}
拆分实数的整数与小数部分
void splitfloat( float x, int *intpart, float *fracpart ){
*intpart=x;
*fracpart=x-*intpart;
}
在数组中查找指定元素
int search( int list[], int n, int x ){
int a;int c=0;
for(int i=0;i<n;i++){
if(list[i]==x){
a=i;c++;
break;
}
}if(c>0)return a;
return -1;
}
使用函数实现字符串部分复制
void strmcpy( char *t, int m, char *s ){
t=t+m-1;
while(*t!='\0'){
*s=*t;
s++;
t++;
}
*s='\0';
}
删除字符
void delchar( char *str, char c ){
int n=strlen(str);int j,i;
for(i=0,j=0;i<n;i++){
if(str[i]==c)continue;
else {
str[j]=str[i];
j++;
}
}
str[j]='\0';
}
判断回文字符串
bool palindrome( char *s ){
int i=0,j=strlen(s)-1;
while(i<j){
if(s[i]!=s[j]) return false;
i++;
j--;
}
return true;
}
分类统计各类字符个数
void StringCount( char *s ){
int a=0,b=0,c=0,d=0,e=0;
while(*s!='\0'){
if(*s>='A'&&*s<='Z')a++;
else if(*s>='a'&&*s<='z')b++;
else if(*s==' ')c++;
else if(*s>='0'&&*s<='9')d++;
else e++;
s++;
}
printf("%d %d %d %d %d",a,b,c,d,e);
}
计算两个复数之积
struct complex multiply(struct complex x, struct complex y){
struct complex sum;
sum.real=x.real*y.real-x.imag*y.imag;
sum.imag=x.real*y.imag+x.imag*y.real;
return sum;
}
按等级统计学生成绩
int set_grade( struct student *p, int n ){
int c=0;
for(int i=0;i<n;i++){
if((*(p+i)).score>=85&&(*(p+i)).score<=100)(*(p+i)).grade='A';
if((*(p+i)).score>=70&&(*(p+i)).score<=84)(*(p+i)).grade='B';
if((*(p+i)).score>=60&&(*(p+i)).score<=69)(*(p+i)).grade='C';
if((*(p+i)).score>=0&&(*(p+i)).score<=59){(*(p+i)).grade='D';c++;}
}return c;
}
判断满足条件的三位数
int pingfan(int n){
double a;
int b;
a=pow(n,0.5);
b=pow(n,0.5);
if((a-b)==0)return 1;
else return 0;
}
int search( int n ){
int falt;int a[3];int c=0;
for(int i=101;i<=n;i++){
int x=i;falt=0;
if(pingfan(i)){int k=0;
while(x){
a[k++]=x%10;
x/=10;
}
for(int j=0;j<2;j++){
int b=a[j];
for(int z=j+1;z<3;z++){
if(b==a[z])falt=1;
}
}
if(falt)c++;
}
else continue;
}
return c;
}
使用递归函数计算1到n之和
int sum( int n ){
return n+sum(n-1);
}
递归求阶乘和
double fact( int n ){
if(n<=0)return 1;
return n*fact(n-1);
}
double factsum( int n ){
if(n<=0)return 0;
return fact(n)+factsum(n-1);
}
递归实现指数函数
double calc_pow( double x, int n ){
if(n<=0)return 1;
else return x*calc_pow(x,n-1);
}
递归求简单交错幂级数的部分和
#include<math.h>
double fn( double x, int n ){
if(n<=0)return 0;
else return pow(-1,n-1)*pow(x,n)+fn(x,n-1);
}
递归计算Ackermenn函数
int Ack( int m, int n ){
if(m==0)return n+1;
if(n==0&&m>0)return Ack(m-1,1);
if(m>0&&n>0)return Ack(m-1,Ack(m,n-1));
}
递归求Fabonacci数列
int f( int n ){
if(n==0)return 0;
else if(n==1)return 1;
else return f(n-1)+f(n-2);
}
十进制转换二进制
void dectobin( int n ){
int m;
m=n%2;
if(n>=2)dectobin(n/2);
putchar(m==0?'0':'1');
return ;
}
递归实现顺序输出整数
void printdigits( int n ){
int a;
if(n<10)printf("%d\n",n);
else {
a=n%10;
printdigits(n/10);
printf("%d\n",a);
}
return ;
}
递归求逆序数
unsigned int reverse( unsigned int number ){
int x=number;int n=0;
while(x){
x/=10;
n++;
}if(number==0)return 0;
return reverse(number/10)+number%10*pow(10,n-1);
}
最大公约数(递归版)
int Gcd(int x, int y){
if(x==0&&y==0)return 1;
else if(x==0&&y!=0)return y;
else if(x!=0&&y==0)return x;
else if(x%y==0)return y;
else return Gcd(y,x%y);
}
报数
void CountOff(int n,int m,int out[]){
int i,j,k;
for(i=0;i<n;i++){
out[i]=0;
}
for(k=0,i=1,j=1;j<=n;k=(1+k)%n){
if(out[k]==0){
if(i==m){
out[k]=j;
j++;
i=0;
}
i++;
}
}
}
有序表的增删改查操作
int insert(int a[ ], int value) {
int i = 0;
for (i = 0; i < Count; i++)
if (a[i] == value)
return -1;
i = 0;
while (i < Count ) {
if (a[i] > value)
break;
i++;
}
if (i == Count)
a[i] = value;
else {
int tmp1 = a[i], tmp2;
a[i] = value;
while (i < Count) {
i++;
tmp2 = a[i];
a[i] = tmp1;
tmp1 = tmp2;
}
}
Count++;
return 1;
}
int del(int a[ ], int value) {
int i = 0, j = 0, flag = 1;
for (i = 0; i < Count; i++) {
if (a[i] == value) {
for (j = i; a[j] != '\0'; j++)
a[j] = a[j + 1];
flag = 0;
}
}
if (flag)
return -1;
Count--;
return 1;
}
int modify(int a[ ], int value1, int value2) {
int i, flag = 1;
for (i = 0; i < Count; i++) {
if (a[i] == value2)
return -1;
if (a[i] == value1)
flag = 0;
}
if (flag)
return -1;
for (i = 0; i < Count; i++)
if (a[i] == value1) {
a[i] = value2;
break;
}
for (i = 0; i < Count; i++)
for (int j = i + 1; j < Count; j++)
if (a[j] < a[i]) {
int tmp = a[j];
a[j] = a[i];
a[i] = tmp;
}
return 1;
}
int query(int a[ ], int value) {
int before = 0, after = Count - 1;
while (before <= after) {
int mid = (before + after) / 2;
if (a[mid] > value)
after = mid - 1;
else if (a[mid] < value)
before = mid + 1;
else
return mid;
}
return -1;
}
字符定位(最后一次找到的字符)
char * match(char *s, char ch)
{
char *p=NULL;
int i;
for(i=0;s[i]!='\0';i++)
{
if(s[i]==ch)
p=s+i;
}
return p;
}
输出月份英文名
char *getmonth( int n ){
if (n < 1 || n > 12){
return NULL;
} else {
switch (n){
case 1: return "January";
case 2: return "February";
case 3: return "March";
case 4: return "April";
case 5: return "May";
case 6: return "June";
case 7: return "July";
case 8: return "August";
case 9: return "September";
case 10: return "October";
case 11: return "November";
default : return "December";
}
}
}
查找星期
int getindex( char *s ){
if (strcasecmp(s, "Sunday") == 0){
return 0;
} else if (strcasecmp(s, "Monday") == 0){
return 1;
} else if (strcasecmp(s, "Tuesday") == 0){
return 2;
} else if (strcasecmp(s, "Wednesday") == 0){
return 3;
} else if (strcasecmp(s, "Thursday") == 0){
return 4;
} else if (strcasecmp(s, "Friday") == 0){
return 5;
} else if (strcasecmp(s, "Saturday") == 0){
return 6;
} else {
return -1;
}
}
计算最长的字符串长度
int max_len( char *s[], int n ){
int max=0;//假设max为s[0]
int i,j;
for(i=0;i<n;i++){
if(strlen(s[max])<strlen(s[i])){
max=i;
}
}
return strlen(s[max]);
}
字符串的连接
char *str_cat(char *s, char *t)
{
int len;
int i;
len = strlen(s);
for (i = 0; *(t + i) != '\0'; i++)
{
*(s + i + len) = *(t + i);
}
return s;
}
指定位置输出字符串
char *match( char *s, char ch1, char ch2 )
{
while(*s!='\0'){
if(*s==ch1){
for(char *s1=s;*s1!='\0';s1++){
printf("%c",*s1);
if(*s1==ch2)break;
}printf("\n");
return s;
}s++;
}printf("\n");
return s;
}
查找子串
char *search( char *s, char *t )
{
int i=0,j=0,k;
for(i=0;s[i]!='\0';i++)
{
k=i;
j=0;//每次比较都从t所指的第一个开始比较
while(s[k]==t[j]&&s[k]!='\0'&&t[j]!='\0')
//判断时要考虑两个是否为\0,如果有一个是则跳出
{
k++;
j++;
}
if(j!=0&&t[j]=='\0')
break;
}
if(s[i]!='\0')
{
s=i+s; //注意先比较再加,否则可能会数组越值
return s;
}
return NULL;
}
奇数值结点链表
/*
* 从标准输入读入一系列正整数,按照读入顺序建立单链表
*/
struct ListNode *readlist() {
// 建立一条带有头节点的单链表
struct ListNode *head = (struct ListNode *) malloc(sizeof(struct ListNode));
head->next = NULL;
struct ListNode *tail = head;
int number;
scanf("%d", &number);
while (number != -1) {
// 临时节点
struct ListNode *temp = (struct ListNode *) malloc(sizeof(struct ListNode));
temp->data = number;
temp->next = NULL;
// 将临时节点链接到链表尾部
tail->next = temp;
// 更新尾节点
tail = temp;
scanf("%d", &number);
}
return head;
}
/*
* 将单链表 L 中奇数值的结点分离出来,重新组成一个新的链表
*/
struct ListNode *getodd(struct ListNode **L) {
// 建立一条带有奇数值链表头节点的单链表
struct ListNode *oddHead = (struct ListNode *) malloc(sizeof(struct ListNode));
oddHead->next = NULL;
struct ListNode *oddTail = oddHead;
// **L:指向指针 L 的指针,存放指针 *L 的地址,*L 中存放的是原链表头节点的地址
struct ListNode *head = *L;
// 因为原链表头节点不存储值,故从头节点的下一个节点开始遍历
while (head->next != NULL) {
// 链表中的值为奇数,则将其存进奇数值链表
if (head->next->data % 2 != 0) {
struct ListNode *oddTemp = (struct ListNode *) malloc(sizeof(struct ListNode));
// 将原链表中的奇数值赋值给奇数值链表
oddTemp->data = head->next->data;
oddTemp->next = NULL;
// 将临时节点连接到奇数值链表尾部
oddTail->next = oddTemp;
// 奇数值链表尾节点后移
oddTail = oddTemp;
// 应题目要求,需删掉原链表中的奇数值节点
struct ListNode *temp = head->next;
head->next = temp->next;
free(temp);
} else {
head = head->next;
}
}
// 因头节点不存储值,故头节点后移一个节点
*L = (*L)->next;
oddHead = oddHead->next;
return oddHead;
}
单链表结点删除
struct ListNode *readlist()
{
int num;
struct ListNode *head,*p;
head=(struct ListNode*)malloc(sizeof(struct ListNode));
p=head;
while(scanf("%d",&num )!=NULL&&num!=-1)
{
p->next =(struct ListNode*)malloc(sizeof(struct ListNode));
p=p->next ;
p->data =num;
p->next=NULL;
}
head=head->next ;
return (head);
}
struct ListNode *deletem( struct ListNode *L, int m )
{
struct ListNode *p,*q;
if(L==NULL)
{
return NULL;
}
p=L;q=p->next ;
while(q)
{
if( q->data ==m )
{
p->next =q->next ;
free(q);
q=p->next ;
}
else
{
p=p->next ;
q=p->next ;
}
}
if(L->data ==m )
{
L=L->next ;
}
return L;
}