还是那个code文件夹里的东西,现在写代码的习惯里必须再增加一条,写明这个程序的作用。我整理了不少图形图像和online judge的程序,每次回想程序的用途都是一件非常麻烦的事情,有的时候根本就想不起来。

树根

这个问题非常的经典,具体的介绍可以参照知乎leetcode.wang的介绍

DigitalRoot

对于给定的数字,将其每一位上的数字相加得到新的数字,一直重复这个过程,直到这个数小于10,将这个数输出。

原数是n,树根就可以表示成(n-1) mod 9 + 1。 主要的用途是计算模运算的同余,对于非常大的数字的情况下可以节省很多时间。数字根可作为一种检验计算正确性的方法。例如,两数字的和的数根等于两数字分别的数根的和。

当时做这道题的时候,想到了树根的问题,但是没有求出其表达式,因而采用了一个比较苯的办法来做计算,即排除数字9,在一个多位数字中,排除9和0的其他数字之和不影响最终的树根结果。那么我就在计算的时候默认排除了9和0的加法运算。

写了一大长串程序,其中的char - '0' 是ASCII运算,将字符转换成其对应的数字,这个程序也是本篇文章中唯一可以正常运行的程序

#include <stdio.h>
int main()
{
      unsigned long a=0,b=0;
      int flag=2;
      char c;
      while(1)
      {
              a=0;b=0;flag=2;
              c=getchar();
              if(c=='0') break;
              else
          {     a=a+(c-'0');
              while((c=getchar())!='\n')
          {
                 if(((c-'0')!=9)&&((c-'0')!=0))
                 {
                     a=a+(c-'0');                             
                 }
          }
         // c='0';
          while(flag>1)
          {    if(a>9)
              {
                  while(a!=0)
                  {    b=b+a%10;
                       a=a/10;
                  }
                  if(b>9) 
                  {
                      flag=2;
                      a=b;
                      b=0;
                  }
                  else{
                       flag=0;
                       a=b;
                       b=0;          
                       break;
                       }            
              }
              else
              {
                  break;
              }
          }
          printf("%d\n",a);
         }
      }  
}

谁知道其实答案如此简单(⊙ˍ⊙)

public int addDigits(int num) {
    return (num - 1) % 9 + 1;
}

回文串

这程序里有bug,目前无法自动停止。输入一串数字,判断这窜数字是否有回文结构。这个题目主要靠算法思想,但是我没什么思想,只会最简单的按位比较.

例如:输入123321,返回YES;输入123231,返回NO。

#include <cstring>
#include<iostream>
using namespace std;
int isPalindrome(char str[])
{
    int len=strlen(str);
    int i,j;
    i=0;
    j=len-1;
    while(i<j)
    {
        if(str[i++]!=str[j--]) return 0;
    }
    return 1;
}
int main(){
    char str[10001];
    int n,i=0;
    cin>>n;
    while(i<=n-1)
    {   i=i+1;
        cin>>str;
        int a=0;
        a=isPalindrome(str);
        if(a==1) cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
    return 0;
}

其他

我忘记了这个程序是做什么的,程序名称是MaxArray,估计是个找最大array相关的程序。从这个例子中深刻的体会到,写代码注释的重要性。

#include <stdio.h>
//#include <stdlib.h>
#define MAX 130
int maxSum(int b[], int n)
{
    int max = b[0];
    int sum = 0;
    for(int i = 0; i < n; ++i)
    {
        if(sum < 0) sum = b[i];
        else sum += b[i];
        if(sum > max) max = sum;
    }
    return max;
}

int solve(int a[][MAX], int n)
{
    int b[MAX];int i,j,k,sum,tmp;
    sum = a[0][0];
    for(i = 0; i < n; ++i)
    {
        for(k = 0; k < n; ++k) b[k] = 0;
        for(j = i; j < n; ++j)
        {
            for(k =0; k < n; ++k) b[k] += a[j][k];
            if(sum < (tmp = maxSum(b,n)) ) sum = tmp;
        }
    }
    return sum;
}

int main()
{
    int arr[MAX][MAX];
    int i,j,n;
    while(scanf("%d",&n)!=EOF)
    {
        for(i = 0; i < n; ++i)
            for(j = 0; j < n; ++j)
                scanf("%d",&arr[i][j]);
        printf("%d",solve(arr,n));
        break;
    }
  //  system("pause");
    return 0;
}


依旧是整理code文件夹里的东西,Fortran语言基本上被我当作化石了,除了在久远的“遗产代码”中你会看到这门语言,当今,应该没有人将它用作主要的编程语言。

我在学习Fortran的时候还是用的 g77,但是现在发现,在我的系统里只能使用gfortran来编译了。

下面是写过的唯一一个代码,其中C开头的是注释,编译方法是 gfortran helloworld.f -o helloworld

传统的 Fortran 程序只能用大写字符书写,而且每行前六个字符为特定用途所保留。第一列为字符 C 所保留,用来表征整行都是注释。第二列到第六列是为标号预留的。代码从第七列开始。下面是示例程序采用的是传统的 Fortran 格式。

C   helloworld.f
C
      PROGRAM HELLOWORLD
      WRITE(*,10)
   10 FORMAT('hello, world')
      END PROGRAM HELLOWORLD
C   http://wiki.ubuntu.org.cn/Compiling_Fortran77
c   g77 helloworld.f -o helloworld

希望这些老古董能尽早退役吧。


为什么我今天这么闲,可以更水这么多篇博客,那是因为昨天在家办公感觉比在办公室还累,所以索性不干了。(*  ̄︿ ̄)

本篇内容所有程序都是MATLAB/GNU Octave上运行的。

注意:有没有最后的end可能是上面两个编译环境的区别,但是我没有安装MATLAB,所以没法测试MATLAB现在的函数组成中是否仍旧不带最后一个end

数值微分法画线

众所周知,在屏幕上连续的点组成了线条。那么如何在计算机中模拟这些由“点”生成的线呢,这就是计算机图形学要研究的内容,其中最简单的一个问题就是画直线。

数值微分法( Digital Differential Analyzer,DDA)是一种处理此种问题的经典算法。

算法思想:

  1. 给定一条线段的起点\((x_1, y_1)\)和终点\((x_2, y_2)\),分别计算在两轴上的差值 \(\Delta y = y_{2} - y_{1}\) 和 \(\Delta x = x_{1} - x_{2}\)。
  2. 比较\(\Delta y\)和\(\Delta x\)二者谁比较大,大的那一个就作为遍历的总步数。\(steps = max(\Delta x, \Delta y)\)。我的程序中简化了这个部分,直接把x作为主序方向。
  3. 计算在x和y方向上单步的步距。 \(d_x = \frac{\Delta x}{steps}\),\(d_y = \frac{\Delta y}{steps}\)。我的程序里只计算了y方向的单步距离,x方向一直是“进1”。
  4. 我的程序中根据\(x_0\)和\(x_1\)的大小决定划线的方向,y增长的部分是根据斜率和目前点的位置来计算的。这个过程涉及大量的浮点运算,效率上是比较低的。
function [Xdata Ydata]=DDALine(x0,y0,x1,y1)
% DDALine(8,9,2,6)
% DDALine(2,6,8,9)
% DDALine(1,9,6,5)
% DDALine(6,5,1,9)
deltaX=x1-x0;
deltaY=y1-y0;
if deltaX~=0&&deltaY~=0
    Slope=double(deltaY)/double(deltaX);
    CurrentY=double(y0);
    j=1;
    if x0<x1
        for CurrentX=int8(x0):int8(x1)
                plot(CurrentX,int8(CurrentY-0.5),'* r');
                Xdata(j)=CurrentX;
                Ydata(j)=int8(CurrentY-0.5);
                hold on;
                
                CurrentY=Slope+CurrentY;
                j=j+1;
        end
    end
     if x0>x1
        for CurrentX=int8(x0):-1:int8(x1)
            plot(CurrentX,int8(CurrentY-0.5),'* r');
            Xdata(j)=CurrentX;
            Ydata(j)=int8(CurrentY-0.5);
            hold on;
            
            CurrentY=-Slope+CurrentY;
            j=j+1;
        end
    end
    title('DDAline');
    xlabel('x');
    ylabel('y');
    hold on
end
if deltaX==0&&deltaY~=0
    plot(x1,min(y0,y1):max(y0,y1),'* r');
end
if deltaX~=0&&deltaY==0
    plot(min(x0,x1):max(x0,x1),y0,'* r');
end
grid on;
end

Bresenham’s line algorithm

Bresenham line’s algorithm 是DDA的一种改进算法。它与DDA相比有质量和效率的两点改进:

  1. 以y方向为例,Bresenham line 根据斜率的方向,决定每一个点是离\(y_1\)还是\(y_2\)近,从而给出下一个点的位置究竟是y+1还是y-1。
  2. 由于上述原因,该方法避免了大量的浮点小数计算。
function  [a,k]=Bresenhamline(x0,y0,x1,y1)
% Bresenhamline(8,9,2,6)
% Bresenhamline(2,6,8,9)
% Bresenhamline(1,9,6,5)
% Bresenhamline(6,5,1,9)
dx=x1-x0;
dy=y1-y0;

d1=abs(2*dx);
d2=abs(2*dy);
x=x0;y=y0;

plot(x,y,'*');
a=[x y];
k=1;
if(abs(dx)>=abs(dy))
    e=-abs(dx);
while abs(x)~=abs(x1)
    if(dx>=0) x=x+1;end
    if(dx<0) x=x-1;end
    e=e+d2;
    if e>0
        if(dy>=0)y=y+1;end
        if(dy<0)y=y-1;end
        e=e-d1;          
    end
    hold on;
    a=[a;x y];k=k+1;
    hold on;
    plot(x,y,'*');
end
end
if(abs(dx)<abs(dy))
    e=-abs(dy);
while abs(y)~=abs(y1)
    if(dy>=0) y=y+1;end
    if(dy<0) y=y-1;end
    e=e+d1;
    if e>0
        if(dx>=0) x=x+1;end
            if(dx<0) x=x-1;end
        e=e-d2;          
    end
    hold on;
    a=[a;x y];k=k+1;
    hold on;
    plot(x,y,'*');
end
end
hold on;
grid on;
end

这因该是最近关于新冠最后的一篇博文了,由于我也在做相关的边缘辅助工作,工作量大,负能量也大,但是不能因为这些问题而让生活变得更糟。

由于美国政府对疫情应对不利,特朗普为了保护他的选举基本盘,已经丧心病狂的直呼新冠病毒是China/Chinese病毒,特朗普上台以后就一直在挑起种族歧视,称中国留学生是间谍,很多华裔学者/对华人有好的学者在美遭受无端调查和指控。

澳大利亚一直是美国的坚定支持者和追随者,反华政策这些年间也接连不断,疫情初期停止中国人入境的国家就属美国和澳大利亚最快。国内的普通人自然会对这两国有着强烈的不满。国内的媒体也会引导舆论,揭露这两国的政客对中国的无端指控和造谣。但是今天新闻出了一个消息“澳总理称美国是澳感染病例最大来源”,这一时间,让很多人认为澳大利亚站在了我们这边,开始谴责美国。结果很多人都在调侃,澳大利亚的立场要偏向中国了,因为他们想要医护物品援助。不管怎样解读,媒体都很好的带起了节奏 —— 即,更多的国家意识到美国是传播疫情的国家。(究竟是不是,我也不知道,但下结论必须有科学严谨的分析,目前的全球状况,我们还是多关注怎么控制传播,治疗疾病,早日结束疫情吧。) 殊不知,莫里森后面就说了新冠疫情起源于中国,传播到了全世界。

如果仔细听这期电台广播,你可以知道莫里森没有对任何国家进行谴责、辩护或者讨好,他只是在陈述他认为的事实情况:由于美澳交往密切,所以澳洲的病例大多源自美国,但是新冠疫情最初爆发在中国,传遍了整个世界。目前为止,没有证据表明任何国家,包括中国,在故意做任何事情。

这并不能说明澳大利亚看待疫情的立场出现了变化,并且开始偏向中国,指责美国。他们想不想借此要中国防护物资单说。

这让我想到n年前,我的同事为了介绍媒体的作用,用到的一幅图《不要让媒体定义你看待事物的方式》

Don't_let_media_define_the_way_you_see_things

媒体可以让人们了解真相,也可以做到颠倒黑白。

如果要看国外消息,最好找原始出处,就像国内的新闻会有“反转”一样,被别有用心剪辑的新闻,能让你对某些事物产生错误的看法。有条件就不要看剪辑后的内容,因为,它很有可能为了突出某种观点而掩盖内容的完整性。

对于中国的攻击会因为疫情而不断持续,并且在美国会变得是一件政治正确的事情,这会煽动很多人的反华情绪,海外华侨华人多保重吧。


我在做聘用制员工,单位在新冠疫情期间不给聘用制员工配备口罩(编制内员工有,从4月开始,他们也给我发口罩了,在这之前只有同事接济一下,但不清楚是否所有的聘用员工都有发,室与室之间是否存在差别。2020年5月3日更新);之前聘用制员工都没有年度体检,我去找领导要求体检(所以今年可以体检了);并且聘用制员工不给办理胸卡,因为疫情没胸卡的不能在食堂吃饭之后,为了吃饭给我们集体办理了胸卡。就先不说这么多乱七八糟的区别对待和疫情期间的一刀切政策了。

最近遇到了这么一个有点恶心的事情,我去吃饭,现在需要刷二维码填报个人信息,但是当时没有在进大楼门口时出示,被保安追来要求出去刷二维码,保安只会追我这种不穿白大衣的(难道单位就不觉得穿着白大衣去食堂很葬么。。。白大衣是工作服,总会曾到一些污染物。为啥食堂还不禁止穿白大衣打饭??这单位真的各种骚操作),因为他不确定我是否真的是员工。我就回到门口刷二维码,并且堵住了其他穿白大衣的员工,让他们也刷码或者出示刷好的截图。结果就堵住了中曾领导和其同事,他的同事也没有刷码,说自己早就刷过了,保安根本不拦截,直接让入内。我就指着那个人说他没有出示证明,之后又指着保安大声说了“要查一起查,不要区别对待”(我很生气),结果这位中层估计是觉得我让他挂不住面子,让我站住,说我不配合检查,不尊重保安,给我领导现在打电话,我还主动把胸卡还递给他,让他方面报我名字找我领导,中曾做完这些之后,可能感觉自己站在了什么制高点,高高兴兴的和同事一起走了。。。

当然,我必须说自己没有执行出示二维码凭证,是不按照规定做事,做得不对,对保安指着说话是不礼貌的,以后遇到这种事情不能自己激动。 但是单位里这么多员工,也不是每人进出大楼都会出示二维码。要执行规定,还应一视同仁。

这保安也就是官本位文化深入骨髓,以自己的规则代替规定,执行检查时,会影响自己饭碗的争一只眼闭一只眼,可以给自己增添“业绩”的严格做。就是有这样的下属和中层,执行规定时才会有漏洞,进而产生更大的问题。

对了,打饭出来,看见那位保安对其他穿白大衣的,也不检查。 ╮(╯_╰)╭

===============

2020年5月3日更新

更新来了,目前单位已经不知道到底要怎么查了,一开始都要查体温和二维码,然后只查体温,后来又变成只查二维码,保安也换了一波又一波。反正穿白大褂的查不严格。我觉得任何人穿个白大衣都能随便进出主楼。

===============

2020年5月27日更新

这个中层,今天大摇大摆的跟着自己的好朋友一起去吃饭,不亮二维码,毫无阻拦的进入主楼。只许州官放火,不许百姓点灯做得太标准了。