[算法]有趣算法合辑[31-40]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[算法]有趣算法合辑[31-40]相关的知识,希望对你有一定的参考价值。
题目31:八进制转换为十进制
1.程序分析:2.程序源码:
main() { char *p,s[6];int n; p=s; gets(p); n=0; while(*(p)!='\0') {n=n*8+*p-'0'; p++;} printf("%d",n); }
题目32:求0—7所能组成的奇数个数。
1.程序分析:2.程序源码:
main() { long sum=4,s=4; int j; for(j=2;j<=8;j++)/*j is place of number*/ { printf("\n%ld",sum); if(j<=2) s*=7; else s*=8; sum+=s;} printf("\nsum=%ld",sum); }
题目33:一个偶数总能表示为两个素数之和。
1.程序分析:2.程序源码:
#include "stdio.h" #include "math.h" main() { int a,b,c,d; scanf("%d",&a); for(b=3;b<=a/2;b+=2) { for(c=2;c<=sqrt(b);c++) if(b%c==0) break; if(c>sqrt(b)) d=a-b; else break; for(c=2;c<=sqrt(d);c++) if(d%c==0) break; if(c>sqrt(d)) printf("%d=%d+%d\n",a,b,d); } }
题目34:推断一个素数能被几个9整除
1.程序分析:2.程序源码:
main() { long int m9=9,sum=9; int zi,n1=1,c9=1; scanf("%d",&zi); while(n1!=0) { if(!(zi/sum)) /*若整数a除以非零整数b。商为整数。且余数为零, 我们就说a能被b整除(或说b能整除a),记作b|a。注意b为0则不叫整除。*/ n1=0; else {m9=m9*10; sum=sum+m9; c9++; } } printf("%ld,can be divided by %d \"9\"",sum,c9); }
题目35:某个公司採用公用电话传递数据,数据是四位的整数。在传递过程中是加密的,加密规则例如以下:
每位数字都加上5,然后用和除以10的余数取代该数字。再将第一位和第四位交换。第二位和第三位交换。1.程序分析:
2.程序源码:
main() {int a,i,aa[4],t; scanf("%d",&a); aa[0]=a%10; aa[1]=a%100/10; aa[2]=a%1000/100; aa[3]=a/1000; for(i=0;i<=3;i++) {aa[i]+=5; aa[i]%=10; } for(i=0;i<=3/2;i++) {t=aa[i]; aa[i]=aa[3-i]; aa[3-i]=t; } for(i=3;i>=0;i--) printf("%d",aa[i]); }
题目36:海滩上有一堆桃子,五仅仅猴子来分。第一仅仅猴子把这堆桃子凭据分为五份。多了一个,这仅仅
猴子把多的一个扔入海中,拿走了一份。第二仅仅猴子把剩下的桃子又平均分成五份,又多了
一个,它相同把多的一个扔入海中,拿走了一份,第三、第四、第五仅仅猴子都是这样做的,
问海滩上原来最少有多少个桃子?
1.程序分析:
2.程序源码:
main() { int i,m,j,k,count; for(i=4;i<10000;i+=4) { count=0; m=i; for(k=0;k<5;k++) { j=i/4*5+1; i=j; if(j%4==0) count++; else break; } i=m; if(count==4) { printf("%d\n",count); break; } } }
题目37:有n个人围成一圈。顺序排号。
从第一个人開始报数(从1到3报数)。凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
1. 程序分析:
2.程序源码:
#define nmax 50 main() { int i,k,m,n,num[nmax],*p; printf("please input the total of numbers:"); scanf("%d",&n); p=num; for(i=0;i<n;i++) *(p+i)=i+1; i=0; k=0; m=0; while(m<n-1) { if(*(p+i)!=0) k++; if(k==3) { *(p+i)=0; k=0; m++; } i++; if(i==n) i=0; } while(*p==0) p++; printf("%d is left\n",*p); }
题目38:递归前n项积
1. 程序分析:2.程序源码:
int fac (int n) { if(n==1) return 1; return n*fac(n-1); }
题目39:移除同样字符串
1. 程序分析:2.程序源码:
public static string RemoveExtraCharAndWithoutSort(string str) { if (string.IsNullOrEmpty(str)) { return null; } int[] tempArr = new int[256]; string newStr = string.Empty; for (int i = 0; i < str.Length; i++) { if (tempArr[str[i]] == 0) { tempArr[str[i]] = 1; newStr += str[i]; } } return newStr; }
题目40:倒数第m个节点
1. 程序分析:相对于双向链表来说,单向链表仅仅能从头到尾依次訪问链表的各个节点,所以假设要找链表的倒数第m个元素也仅仅能从头到尾进行查找,在查找的过程中,设定两个指针。当中current指针指向当前訪问的节点。
previous指针指向current之前的节点,且两者之间相距m个节点。这样,当current指针指向最后
一个节点时。那previous指针指向的元素就是倒数第m个元素,程序的处理步骤例如以下:
2.程序源码:
element *CLinkList::FindMToLastElement(int m) { element *previous, *current; previous = current = head; // 訪问前m-1个节点 for(int i = 0; i < m-1; ++i) { current = current->next; if(current == NULL) { printf("number overstep\n"); return NULL; } } //previous指针和current指针一起向尾移动 while(current->next != NULL) { previous = previous->next; current = current->next; } //返回previous指针 return previous; }
以上是关于[算法]有趣算法合辑[31-40]的主要内容,如果未能解决你的问题,请参考以下文章
剖析 | 蚂蚁金服生产级 Raft 算法 SOFAJRaft 合辑