博文

牛顿法求平方根和立方根(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)

阅读全文(9170) | 评论: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;
 ......

阅读全文(8152) | 评论: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");
        }    
  ......

阅读全文(2319) | 评论: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;
    }
    }
......

阅读全文(2210) | 评论: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;
  &......

阅读全文(2323) | 评论: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;

阅读全文(2146) | 评论: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("*&q......

阅读全文(2220) | 评论: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++)
    {
       &nbs......

阅读全文(2325) | 评论: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......

阅读全文(2506) | 评论: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()
{<......

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