The goal of this article is to give an overview of numerical problems encountered when determining the electronic structure of materials and the rich variety of techniques used to solve these problems. The paper is intended for a diverse scientific computing audience. For this reason, we assume the reader does not have an extensive background in the related physics. Our overview focuses on the nature of the numerical problems to be solved, their origin, and the methods used to solve the resulting linear algebra or nonlinear optimization problems. It is common knowledge that the behavior of matter at the nanoscale is, in principle, entirely determined by the Schrödinger equation. In practice, this equation in its original form is not tractable. Successful but approximate versions of this equation, which allow one to study nontrivial systems, took about five or six decades to develop. In particular, the last two decades saw a flurry of activity in developing effective software. One of the main practical variants of the Schrödinger equation is based on what is referred to as density functional theory (DFT). The combination of DFT with pseudopotentials allows one to obtain in an efficient way the ground state configuration for many materials. This article will emphasize pseudopotential-density functional theory, but other techniques will be discussed as well.