北理工c语言程序设计N-26. 没有圣诞树的圣诞夜

题目描述:

因为疫情,David没有出门购买圣诞节所需要的圣诞树,心里感觉空落落的。请你用程序给他绘制一个圣诞树,满足他的心愿。绘制规则如下:

1.输入的正整数n为总行数;

2.每三行一组,最后剩下的1~3行绘制树干,整体居中;

3.每一组(以第i组为例,i从1开始)第一行打印3个’’,第二行打印3+4i个’’,第三行打印3+8i个’*’;

4.树干的那几行每行3个’*’。

–by 李彦君

输入格式:

输入正整数n

输出格式:

参照题干和样例

样例输入:

12

样例输出:

        ***

      *******

    ***********

        ***

    ***********

*******************

        ***

  ***************

        ***

        ***

        ***

数据范围:

1≤n≤42

#include <stdio.h> 
int main(){ 
   int n,group,shugan,dizuo,zhongjianweizhi,i,j,k,g,z,l,shuganflag,m; 
 scanf("%d",&n); 
    //判断一下行数是不是三的倍数  
   if(n%3==0){ 
    group=n/3-1; 
   shugan=3;    
   } 
  else if(n%3!=0){ 
   group=n/3; 
 shugan=n%3;  
   } 
  dizuo=3+8*group; 
   zhongjianweizhi=(dizuo/2)+1; 
   //开始画图  
    for(i=1;i<=group;i++){ 
      for(j=1;j<zhongjianweizhi-1;j++){ 
           printf(" "); 
       } 
      printf("***\n"); 
       for(k=1;k<zhongjianweizhi-(3+4*i)/2;k++){ 
           printf(" "); 
       } 
      for(g=1;g<=3+4*i;g++){ 
          printf("*"); 
       } 
      printf("\n"); 
      for(z=1;z<zhongjianweizhi-(3+8*i)/2;z++){ 
           printf(" "); 
       } 
      for(l=1;l<=3+8*i;l++){ 
          printf("*"); 
       } 
      printf("\n"); 
   
}  
for(shuganflag=1;shuganflag<=shugan;shuganflag++){ 
      for(m=1;m<zhongjianweizhi-1;m++){ 
           printf(" "); 
       } 
      printf("***\n"); 
   } 
       
}  
<think>嗯,用户之前问过关于C#中字符串相似度匹配的方法,现在又具体问到了余弦相似度。我需要先回顾一下之前提供的回答,确保这次的信息一致且更详细。用户可能是在实际项目中遇到了需要比较文本相似度的问题,比如文档比对、搜索引擎优化或是推荐系统。 用户给出的步骤已经比较清晰,但可能需要更详细的解释和示例。他们可能想知道具体的实现方法,尤其是在C#中如何处理。比如,如何分词,构建词频向量,以及具体的数学计算步骤。此外,用户可能对如何优化这个过程或者实际应用中的注意事项感兴趣。 要注意的是,用户可能不太熟悉向量空间模型或者TF-IDF这些概念,所以需要用简单易懂的语言解释。同时,提供代码示例会很有帮助,尤其是C#的实现,这样用户可以直接应用到项目中。另外,用户可能想知道余弦相似度的优缺点,以及适用场景,这样他们能判断是否适合当前的需求。 还要检查之前提到的FuzzySharp库是否包含余弦相似度的实现,如果没有,可能需要推荐其他库或者引导用户自行实现。最后,确保回答结构清晰,分步骤说明,可能包括优缺点和实例应用,这样用户能全面理解并应用余弦相似度。</think>以下是关于**余弦相似度(Cosine Similarity)**的详细说明: --- ### **核心概念** 余弦相似度通过计算两个向量夹角的余弦值来衡量相似性,常用于文本相似度比较。其数学本质是将字符串视为向量空间中**词频构成的向量**,通过夹角大小反映语义相关性。计算公式为: $$ \text{相似度} = \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{\|\mathbf{A}\| \times \|\mathbf{B}\|} $$ 其中: - $\mathbf{A} \cdot \mathbf{B}$ 表示向量点积 - $\|\mathbf{A}\|$ 和 $\|\mathbf{B}\|$ 表示向量的模长 --- ### **实现步骤(以C#为例)** #### **1. 分词与构建词频向量** ```csharp // 示例:简单分词(按空格分割) public Dictionary<string, int> BuildTermVector(string text) { string[] words = text.ToLower().Split(new[] { ' ', ',', '.' }, StringSplitOptions.RemoveEmptyEntries); var vector = new Dictionary<string, int>(); foreach (string word in words) { if (vector.ContainsKey(word)) vector[word]++; else vector[word] = 1; } return vector; } ``` #### **2. 合并词表生成统一维度向量** ```csharp // 合并两个词频字典的所有键(词汇表) public HashSet<string> MergeVocabulary(Dictionary<string, int> vec1, Dictionary<string, int> vec2) { var vocab = new HashSet<string>(vec1.Keys); vocab.UnionWith(vec2.Keys); return vocab; } ``` #### **3. 计算点积** ```csharp public double DotProduct(Dictionary<string, int> vecA, Dictionary<string, int> vecB, HashSet<string> vocab) { double product = 0; foreach (string word in vocab) { int countA = vecA.TryGetValue(word, out int a) ? a : 0; int countB = vecB.TryGetValue(word, out int b) ? b : 0; product += countA * countB; } return product; } ``` #### **4. 计算模长** ```csharp public double VectorMagnitude(Dictionary<string, int> vector) { double sum = 0; foreach (var count in vector.Values) { sum += Math.Pow(count, 2); } return Math.Sqrt(sum); } ``` #### **5. 综合计算余弦相似度** ```csharp public double CosineSimilarity(string text1, string text2) { var vecA = BuildTermVector(text1); var vecB = BuildTermVector(text2); var vocab = MergeVocabulary(vecA, vecB); double dot = DotProduct(vecA, vecB, vocab); double magA = VectorMagnitude(vecA); double magB = VectorMagnitude(vecB); return magA * magB == 0 ? 0 : dot / (magA * magB); } ``` --- ### **优化方向** 1. **词权重改进** - 使用**TF-IDF**替代简单词频: $$ \text{TF-IDF}(t,d) = \text{词频}(t,d) \times \log\left(\frac{\text{总文档数}}{\text{包含t的文档数}}\right) $$ 2. **N-gram扩展** 将单词拆分为字符级别的N-gram(如bigram),增强对拼写错误的鲁棒性 3. **预训练词向量** 使用Word2Vec、GloVe等模型将单词映射为语义向量(需引入机器学习库) --- ### **优缺点分析** | 优点 | 缺点 | |------|------| | 不受文本长度影响 | 忽略词序("猫追狗" vs "狗追猫"得分相同) | | 计算效率较高 | 需处理高维稀疏向量 | | 可扩展性强(支持TF-IDF/N-gram) | 依赖分词质量 | --- ### **实际应用场景** - 文档查重检测 - 搜索引擎结果排序 - 推荐系统的内容匹配 - 聊天机器人意识别 --- ### **示例测试** ```csharp string text1 = "苹果手机新款发布"; string text2 = "苹果公司推出新手机"; double similarity = CosineSimilarity(text1, text2); // 结果约0.67 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值