博文

牛顿法求平方根和立方根(2005-08-23 19:28:00)

摘要:例题:采用牛顿法求平方根 给定一个正数x,如何计算x的平方根呢? 牛顿的逐步逼近法 对于x的平方根,给定一个猜测值y,则y与x/y的平均值是比y更好的一个猜测值,继续这一过程,会得到越来越好的猜测值。 如何用过程语言表述这一计算过程? 初始条件:给定 x 和 猜测值 guess sqrt(guess,x){ if(goodEnough(guess,x)) return guess; return sqrt(improve(guess,x),x); } goodEnough(guess,x){     if(abs(guess*guess-x)<threshold) return true;     return false; } Improve(guess,x){    return (guess+x/guess)/2;    } 这个例子体现了 可以通过一个过程递归的方法得到越来越好的猜测值; 可以把过程抽象成一个个的黑箱,来完成不同的操作,过程的抽象一方面隐蔽了一些细节,使求解的过程更清晰,另一方面可以通过局部的修改改进整个求值过程的功能; 例如,通过修改goodEnough里面的threshold就可以改变求解的精度,而不必修改其它部分。 求立方根的牛顿法基于如下事实,如果y是x的立方根的一个近似值,那么下式将给出一个更好的近似值:             (x/y2+2y)/3     请利用这一公式实现一个类似平方根过程的求立方根的过程。 代码: #include<stdio.h> #include <math.h> float fun(float guess,float x) {     if(abs(guess*guess*guess-x)<0.0000001) return guess;     else &nb......

阅读全文(20818) | 评论:2

求最大公约数的两种算法(2005-08-23 19:03:00)

摘要:求最大公约数的两种算法 ________________________________________ 辗转相除法和移位相减法(Euclid & stein 算法) 给出Stein算法如下: 1.    如果A=0,B是最大公约数,算法结束 2.    如果B=0,A是最大公约数,算法结束 3.    设置A1 = A、B1=B和C1 = 1 4.    如果An和Bn都是偶数,则An+1 =An /2,Bn+1 =Bn /2,Cn+1 =Cn *2(注意,乘2只要把整数左移一位即可,除2只要把整数右移一位即可) 5.    如果An是偶数,Bn不是偶数,则An+1 =An /2,Bn+1 =Bn ,Cn+1 =Cn (很显然啦,2不是奇数的约数) 6.    如果Bn是偶数,An不是偶数,则Bn+1 =Bn /2,An+1 =An ,Cn+1 =Cn (很显然啦,2不是奇数的约数) 7.    如果An和Bn都不是偶数,则An+1 =|An -Bn|,Bn+1 =min(An,Bn),Cn+1 =Cn 8.    n++,转4 //greatest common divisor //by heaton //2005/03/11 #include <iostream> using namespace std; //交换a ,b的值 void swap(int& a1,int &b1) {     int temp;     temp=a1;     a1=b1;     b1=temp; }       //辗转相除法 int gcd(int a,int b) {  &......

阅读全文(19813) | 评论:0

stu(1147)Z(2005-08-23 18:46:00)

摘要:#include<stdio.h> int main() {     char c;     int i;     int t;     for(c=getchar();c!=-1;c=getchar())     {         if(c=='%'){             scanf("%d",&t);             for(i=0;i<t;i++) printf(" ");         }             else if(c=='#'){             scanf("%d",&t);             for(i=0;i<t;i++) printf("\n");         }             else if(c=='@') printf("......

阅读全文(2405) | 评论:0

pku(2000)(2005-08-23 02:10:00)

摘要:#include <stdio.h> int main() { int days; int i=1; int pos; long money; while(scanf("%d",&days)) {     pos=1;     i=0;     money=0;     if(days==0) return 0;     while(1)     {     if(days>i)     {         money+=pos*pos;         i+=pos;         /* printf("%d-%d-%d-%d ",days,i,money,pos); */         pos=pos+1;     }     else     {     money-=(i-days)*(pos-1);     break;     }     }     printf("%d %ld\n",days,money); } } ......

阅读全文(2288) | 评论:0

test(2159)(2005-08-23 01:23:00)

摘要:              #include <stdio.h> #include <string.h> int main() { char a[100],b[100]; int c[26],d[26]; int i,j,k; int flag=0; scanf("%s%s",a,b); for(j=1;j<=25;j++) { for(i=0;i<26;i++) c[i]=d[i]=0; for(i=0;i<strlen(a);i++) {     if(a[i]-'A'>=j)     a[i]-=j;     else     a[i]+=26-j ;     /* if(a[i]=='A') */     /* a[i]='Z'; */     /* c[25]++; */     /* else */     /* c[a[i]-'B']++; */ } for(i=0;i<strlen(a);i++) d[b[i]-'A']++; for(i=0;i<26;i++) {     if(c[i]!=d[i])     {         flag=1;         break;     } } if(flag==0) { printf("YES\n"); return 0; } } pri......

阅读全文(2405) | 评论:0

pku(2196)(2005-08-23 00:40:00)

摘要:#include <stdio.h> int main() { int i; int a,b,c; int sum; for(i=2992;i<10000;i++) {     a=b=c=0;     sum=i;     a+=sum/1000;     sum=sum%1000;     a+=sum/100;     sum=sum%100;     a+=sum/10;     sum=sum%10;     a+=sum;      sum=i;     b+=sum/1728;     sum=sum%1728;     b+=sum/144;     sum=sum%144;     b+=sum/12;     sum=sum%12;     b+=sum;      sum=i;     c+=sum/4096;     sum=sum%4096;     c+=sum/256;     sum=sum%256;     c+=sum/16;     sum=sum%16;     c+=sum;   &nb......

阅读全文(2238) | 评论:0

pku(2136)没有通过(2005-08-23 00:27:00)

摘要:#include<iostream.h> #include <stdio.h> #include <string.h> int b[26]; int main() { char a[72]; int i,j; int max=0,max2; for(i=0;i<26;i++) b[i]=0; for(i=0;i<=4;i++) {     cin.getline(a,72);     for(j=0;j<strlen(a);i++)     if(a[j]>='A' && a[j]<='Z')     b[a[j]-'A']++; } for(i=0;i<26;i++) if(b[i]>max) max=b[i]; for(i=0;i<max;i++) {     for(j=25;j>=0;j++)     if(b[j]>=max-i)     {     max2=j;     break;     }     for(j=0;j<=max2;j++)     {         if(b[j]>=max-i)         printf("*");         else         printf(" "......

阅读全文(2312) | 评论:0

pku(2105)(2005-08-22 23:59:00)

摘要:#include<stdio.h> #include <math.h> int main() { int n,i,num; int pos; char a[40]; scanf("%d",&n); for(i=0;i<n;i++) {     scanf("%s",a);     num=0;     for(pos=0;pos<=7;pos++)     {         num+=(a[pos]-'0')*(int)pow(2,7-pos);     }     printf("%d.",num);     num=0;     for(pos=0;pos<=7;pos++)     {         num+=(a[pos+8]-'0')*(int)pow(2,7-pos);     }     printf("%d.",num);     num=0;     for(pos=0;pos<=7;pos++)     {         num+=(a[pos+16]-'0')*(int)pow(2,7-pos);     }     printf("......

阅读全文(4772) | 评论:0

pku(1080)没有通过(2005-08-22 23:36:00)

摘要:#include<stdio.h> #include <string.h> char a[100],b[100],c[100]; int max; int ctoi(char a) {     if(a=='A')     return 0;     if(a=='C')     return 1;     if(a=='G')     return 2;     if(a=='T')     return 3;     if(a=='-')     return 4; } int fun2(char a,char b) {        int arr[5][5]={     {5,-1,-2,-1,-3},     {-1,5,-3,-2,-4},     {-2,-3,5,-2,-2},     {-1,-2,-2,5,-1},     {-3,-4,-2,-1,0}};     return arr[ctoi(a)][ctoi(b)]; } int fun(char *s,int n,int l) {     char s1[100];     int i,j;     int sum=0;     if(l==0)     { &n......

阅读全文(2594) | 评论:0

字符串中添加n个'-'的所有情况.(2005-08-22 23:07:00)

摘要:#include<stdio.h> #include <string.h> int fun(char *s,int n,int l) {     char s1[100];     int i,j;     if(l==0)     {         printf("%s\n",s);         return 0;     }     strcpy(s1,s);     for(i=0;i<=n;i++)     {         strcpy(s1,s);         for(j=n-1;j>=i;j--)         s1[j+1]=s1[j];         s1[i]='-';         s1[n+1]='\0';         fun(s1,n+1,l-1);     } } int main() { char a[100]; int i,len; scanf("%d%s",&len,a); fun(a,strlen(a),len); getch(); } 输入......

阅读全文(15750) | 评论:2