首页 > 技术文章 > week3a:个人博客作业

lenrehy 2016-03-18 14:56 原文

1.博客上的问题

阅读下面程序,请回答如下问题:

using System;

using System.Collections.Generic;

using System.Text;

namespace FindTheNumber

{
  class Program
  {
    static void Main(string[] args)
    {
      int [] rg =
          {2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
           20,21,22,23,24,25,26,27,28,29,30,31};
      for (Int64 i = 1; i < Int64.MaxValue; i++)
      {
        int hit = 0;
        int hit1 = -1;
        int hit2 = -1;
        for (int j = 0; (j < rg.Length) && (hit <=2) ; j++)
        {
          if ((i % rg[j]) != 0)
          {
            hit++;
            if (hit == 1)
            {
              hit1 = j;
            }
            else if (hit == 2)
            {
              hit2 = j;
            }
            else
              break;
          }

        }
        if ((hit == 2)&& (hit1+1==hit2))
        {
          Console.WriteLine("found {0}", i);
        }
      }
    }
  }
}

这个题之前先搞懂这几个问题

using System;程序使用了系统的命名空间

using System.Collections.Generic;主要用来创建强类型集合,以提高类型安全和操作性能

using System.Text;引入文本操作命名空间,能够使用如StringBuilder、字符操作等类

Console.WriteLine("found {0}", i);就是printf("found%d",i);

rg.Length; 表示的是数组的长度这里是30

t64.MaxValue 表示的2的64次方减一 

结果如下:

问题1:这个程序要找的是符合什么条件的数?

1,1在0——2^64-1之间找到可以被2-31中连续2项有余项,后面的数都可以整除的数

问题2:这样的数存在么?符合这一条件的最小的数是什么?

1,2待求中,打算写一个c语言程序开始计算

编了如下程序

#include<stdio.h>
#include<stdlib.h>
void  Main()
{
    int i,j;
    int rg[] =
    { 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
    20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31 };
    j = 0;
    for (i = 1; j <=4294967295; )
    {
        int hit = 0;
        int hit1 = -1;
        int hit2 = -1;
        for (int j = 0; (j < 30) && (hit <= 2); j++)
        {
            if ((i % rg[j]) != 0)
            {
                hit++;
                if (hit == 1)
                {
                    hit1 = j;
                }
                else if (hit == 2)
                {
                    hit2 = j;
                }
                else
                    break;
            }

        }
        if ((hit == 2) && (hit1 + 1 == hit2))
        {
            printf("%d\n", i);
        }
        if (i == 4294967295)
        {
            j++;
        }
        else
        {
            i++;
        }
    }
}

结果是没有出来,

问题3:在电脑上运行这一程序,你估计多长时间才能输出第一个结果?时间精确到分钟(电脑:单核CPU 4.0G Hz,内存和硬盘等资源充足)。

不知道该怎么做

问题4:在多核电脑上如何提高这一程序的运行效率?

程序分成2部分,在2个核中交替进行(猜想)。

1,3后面的待求

2.今天编写的程序

  我想了许久,第一眼看到看到题目,一瞬间傻了眼。这次题目什么是4页,这么多要求啊,能做完吗,看了一眼发现好麻烦啊,往常也就值几行这次这么多啊。早晚都要做,不看到时候做不出了,不符合自己的作风。就仔细把书上的要求看了一遍,发现要求确实很多。一点一点做吧,就开始构思这个程序的框架是什么样子,大致写的想好后,再次看了一遍作业发现,只需做记录单词这部分。开始思考需求是什么,这里虽然只是说是单词,但是单词指的是什么,指的是英语里面的单词吗?考虑大小写吗?还是c语言中的标识符?

英语中的单词,好处理。重点就c语言的标志符。变量名由于本身的规定略微不好处理。这里面有没有注释。注释中的单词在不在记录的单词的个数了。注释有2种表示,面对这2种注释形式该如何处理。

  根据以上的可能的需求,我选择了,c语言,标志符,两种注释都要考虑。

  思路:

  从一个文件中读取数据,使用2个长度为11的字符串。交替从文件读取数据,把这两数组中的空格,注释,回车删除,剩下数据放入另一个文件中,统计另一个文件中的标识符。(初想)

程序1版(统计英语中的单词)

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

int main(int argc, char* argv[])
{
    FILE *fp; // fp1:读取的文件
    int n=0; //记录单词的个数
    int m=0;  //表示是否开始计算 m=0不 m=1 开始
    char word;
    fp=fopen("text.cpp","r");
    if(fp==NULL)
    {
        printf("text.txt文件打开失败\n");
        exit (1);
    }
    while(feof(fp)==0)
    {
        fscanf(fp,"%c",&word);
        if(word<='Z'&&word>='A')
        {

            if(m==0)
            {
                n++;
                m=1;
            }
        }
        else if(word<='z'&&word>='a')
        {
            if(m==0)
            {
                n++;
                m=1;
            }
        }
        else 
        {
                m=0;
        }
    }
    printf("%d\n",n);
    fclose(fp);
    return 0;
}

在做的过程中发错若是这种则只需要读入一个字符就行。

程序2版(c语言中的标识符,变量名,注释)

再写这个版本的时候有再次思考自己的第一种思路是否正确,经过40分钟的思考,优化了自己的思路。没有必要使用2个字符串数组,只要使用一个字符变量不断的读取,同时也具体思考了,最新版本使用那些变量。最终形成来了。如下版本

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
int Rsecond();//读第二个文件记录单词
void Wsecond();//从原始文件中读取数据 删除 代码缩进 回车 空格 注释写入第二个程序
int main(int argc, char* argv[])
{
    int n;
    Wsecond();
    n=Rsecond();
    printf("%d",n);
    return 0;
}
void Wsecond()
{
    char w;  //表示从text1.txt文件读入的字符
    int wt,f1,f2;  //wt:是否可以写入文件的标志f1:是否是"//"这种注释的标志f2:是否是"/**/"这种注释
    FILE *fp1,*fp2; // fp1:读取原始文件 fp2: 写入第二个文件 fp3: 读第二个文件
    fp1=fopen("text1.txt","r");
    if(fp1==NULL)
    {
        printf("text1.txt文件打开失败\n");
        exit (1);
    }
    fp2=fopen("text2.txt","w");
    if(fp2==NULL)
    {
        printf("text2.txt文件打开失败\n");
        exit (1);
    }
    wt=1;
    f1=0;
    f2=0;
    while(feof(fp1)==0)
    {
        fscanf(fp1,"%c",&w);
        switch(w)
        {
        case ' ':
        case '\t':
        case '\n': 
            {
                if(f1==1)
                {
                    f1=0;
                }
                else
                {
                    wt=0;
                }
                break;
            }
        case '/':
            {
                if(feof(fp1)==0)
                {
                    fscanf(fp1,"%c",&w);
                    if(w=='/')
                    {
                        wt=0;
                        f1=1;
                        break;
                    }
                    else if(w=='*')
                    {
                        wt=0;
                        f2=1;
                        break;
                    }
                }
                else
                    break;
            }
        case '*':
            {
                if(feof(fp1)==0)
                {
                    fscanf(fp1,"%c",&w);
                    if(w=='/')
                    {
                        f2=0;
                        break;
                    }
                }
                else
                    break;
            }
        }
        if(wt==1)
        {
            fprintf(fp2,"%c",w);
        }
        if(f1!=1&&f2!=1)
        {
            wt=1;
        }
    }
    fprintf(fp2,"\n");
    fclose(fp1);
    fclose(fp2);
}
int Rsecond()
{
    int n=0; //记录单词的个数
    int m=0;  //表示是否开始计算 m=0不 m=1 开始
    int f=1; //表示标志符的第一个字符 f=0 不是 f=1 是第一个字符
    char word;
    FILE *fp;
    fp=fopen("text2.txt","r");
    if(fp==NULL)
    {
        printf("text2.txt文件打开失败\n");
        exit (1);
    }
    while(feof(fp)==0)
    {
        fscanf(fp,"%c",&word);
        if((word<='Z'&&word>='A')||(word<='z'&&word>='a')||word=='_')
        {
            if(f==1)
            {
                f=0;
                if(m==0)
                {
                    n++;
                    m=1;
                }
            }
        }
        else if(f==0)
        {
            if(word<='9'&&word>='0')
            {
                if(m==0)
                {
                    n++;
                    m=1;
                }
            }
            else
            {
                m=0;
                f=1;
            }
        }
        else 
        {
            m=0;
            f=1;
        }
    }
    printf("%d\n",n);
    fclose(fp);
    return n;
}
 

 

推荐阅读