第一章-算法概述

第一题

问题名称:统计页码数字问题。

问题描述:给定一个数n,计算从0到n出现过多少次0,1,2,...,9。数字n开头不能有0,如6不能表示为06或006。

数据输入:数据输入由input.txt文件提供。每个文件只有1行,给出数字n。

结果输出:将输出结果保存到output.txt文件中。每个文件只有10行,第k行输出数字k-1的次数,k=1,2,...,10。

时间复杂度为O(n * log10(n))的算法:

 1 #include <stdio.h>
 2 
 3 void statNumber(int n);
 4 
 5 void main()
 6 {
 7     int n;
 8     scanf("%d",&n);
 9     statNumber(n);
10 }
11 void statNumber(int n)
12 {
13     int t, i;
14     int count[10] = {0};
15     
16     for(i = 0;i <= n ; i++ ) {
17         t = i;
18         if( t == 0 ) {
19             count[t % 10]++;
20         }
21         while(t){
22             count[t % 10]++;
23             t /= 10;
24         }
25     }
26     for(i = 0;i < 10;i++)
27         printf("%d\n", count[i]);
28 }
View Code

时间复杂度为O(log10(n))的算法:

 

第二题

 

问题名称:最多约数问题。

 

问题描述:正整数x的约数是能整除x的正整数。正整数x的约数个数记为div(x)。例如,1,2,5,10都是正整数10的约数,且div(10)=4。设a和b是2个正整数,a<=b,找出a和b之间约数个数最多的数x。

 

数据输入:输入数据由input.txt文件提供,第1行有2个正整数a和b(分开)。

 

结果输出:程序运行结束时,若找到的a和b之间约数个数最多的数是x,将div(x)输出到output.txt中。

1、求素数:

#include <stdio.h>
#include <math.h>

int isprime(int n);

int main()
{
    int n;
    printf("请输入大于1的正整数:\n");
    scanf("%d", &n);
    while (n <= 1)
    {
        printf("请输入大于1的正整数:\n");
        scanf("%d", &n);
    }
    printf("%d\n", isprime(n));
    return 0;
}

int isprime(int n)
{
    if (n == 2)
        return true;
    if (n % 2 == 0)        //偶数直接排除
        return false;
    for (int i = 3; i <= sqrt(n); i = i + 2)
    {
        if (n % i == 0)
        {
            return 0;
        }
    }
    return 1;
}

2、求一个整型数的位数:

#include <stdio.h>

int main()
{
    int n, i;
    scanf("%d", &n);
    for(i = 0; n != 0; i++)
    {
        n /= 10;
    }
    printf("%d\n", i);    //最后i就是位数
    return 0;
}

3、计算两个正整数的最大公约数GCD:

利用欧几里得算法(辗转相除法):

int GreatestCommonDivisor(int a, int b)
{
    if(b == 0)
        return a;
    else
        return GreatestCommonDivisor(b, a % b);        //粗略的理解就是一直除b,直到能除尽,则b是GCD
}

4、计算n层嵌套平方根:

n层嵌套,就有n个根号,就是有n个sqrt。但是目前的算法到一定的精度,就会不在进位,导致n增大,值不变。

#include <stdio.h>
#include <math.h>

double square(float x, int n)
{
    if (n == 1)
    {
        return sqrt(x);
    }
    else
    {
        return sqrt(x + square(x, n - 1));
    }
}

int main()
{
    double result = square(4, 5000);
    printf("%f\n", result);
    return 0;
}

数组转置:

按照原来的顺序输出是:matrix[i][j],那么转置输出就是:matrix[j][i]。

#include <stdio.h>

#define N 10

void input(int matrix[N][N], int n);
void transpose(int matrix[N][N], int n);
void output(int matrix[N][N], int n);

int main()
{
    int matrix[N][N] = {0};
    int n;
    printf("Input n:\n");
    scanf("%d", &n);
    printf("Input %d*%d matrix:\n", n, n);
    input(matrix, n);
    printf("The transposed matrix is:\n");
    transpose(matrix, n);
    //output(matrix, n);
    return 0;
}
void input(int matrix[N][N], int n)
{
    int i, j;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            scanf("%d", &matrix[i][j]);
        }
    }
}
void transpose(int matrix[N][N], int n)
{
    int i, j;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            printf("%4d ", matrix[j][i]);
        }
        printf("\n");
    }
}
void output(int matrix[N][N], int n)
{
    int i, j;
    for(i = 0; i < n; i++)
    {
        for(j = 0; j < n; j++)
        {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
}

 

posted @ 2016-10-25 20:56  不抛弃,不放弃  阅读(337)  评论(0编辑  收藏  举报